Java 该方法不适用于参数

Java 该方法不适用于参数,java,interface,Java,Interface,我有一个接口和两个实现它的类,还有一个有两个方法的第三个类-一个获取第一个类对象作为参数,第二个获取另一个。我有一个包含两种类型对象的向量,我想在每个元素上使用第三个函数的方法,而不必强制转换类型,因为我不知道每个向量元素是什么类型。我该怎么做?代码如下: public interface Transport { } public class Car implements Transport { } public class Bike implements Transport { } pu

我有一个接口和两个实现它的类,还有一个有两个方法的第三个类-一个获取第一个类对象作为参数,第二个获取另一个。我有一个包含两种类型对象的向量,我想在每个元素上使用第三个函数的方法,而不必强制转换类型,因为我不知道每个向量元素是什么类型。我该怎么做?代码如下:

public interface Transport {
}

public class Car implements Transport {
}

public class Bike implements Transport {
}

public class Operation {
    public void operation(Car c) {
        System.out.println("1");
   }

   public void operation(Bike b) {
       System.out.println("2");
   }
总的来说,我有:

Transport[] t = new Transport[3];
t[0] = new Car();
t[1] = new Bike();
t[2] = new Car();
Operation op = new Operation();
op.operation(t[0]); // here I get the error - method not applicable for arguments 

这段代码是我所做的工作的简化版本,为了更易于阅读,它不仅有三个元素,而且它们是根据它得到的输入在for循环中创建的。

在编译器不知道表达式的运行时类型的情况下,您试图使用方法重载

具体来说,编译器不知道
t[0]
Car
还是
Bike
,因此会发出错误

您可以通过反转调用来解决此问题:为
传输
提供一个调用
操作
的方法,然后改为调用它:

public interface Transport {
    void performOperation(Operation op);
}

public class Car implements Transport {
    public void performOperation(Operation op) { op.operate(this); }
}

public class Bike implements Transport {
    public void performOperation(Operation op) { op.operate(this); }
}
现在您可以按如下方式拨打电话:

Transport[] t = new Transport[3];
t[0] = new Car();
t[1] = new Bike();
t[2] = new Car();
Operation op = new Operation();
t[0].performOperation(op); 

这种技术通常被称为。

当编译器不知道表达式的运行时类型时,您试图使用方法重载

具体来说,编译器不知道
t[0]
Car
还是
Bike
,因此会发出错误

您可以通过反转调用来解决此问题:为
传输
提供一个调用
操作
的方法,然后改为调用它:

public interface Transport {
    void performOperation(Operation op);
}

public class Car implements Transport {
    public void performOperation(Operation op) { op.operate(this); }
}

public class Bike implements Transport {
    public void performOperation(Operation op) { op.operate(this); }
}
现在您可以按如下方式拨打电话:

Transport[] t = new Transport[3];
t[0] = new Car();
t[1] = new Bike();
t[2] = new Car();
Operation op = new Operation();
t[0].performOperation(op); 

这种技术通常被称为。

将operation()方法放在Transport类中,并在Car和Bike中重写它。这就是多态性的含义:
t[0]。operation()
。将其重命名为
move()
,并将传输接口重命名为
Vehicle
,以理解该概念。将operation()方法放在传输类中,并将其覆盖在Car和Bike中。这就是多态性的含义:
t[0]。operation()
。将其重命名为
move()
,并将传输接口重命名为
Vehicle
,以理解该概念。@davidxxx我看不出它们是如何在同一结构中混淆的:
Transport
是可访问的,而
Operation
是访问者。您的方式是访问者模式的特定形式:)事实上,我的意思是,它忽略了访问者实现背后的接口,该接口允许被访问元素接受任何访问者实现。再举一个好例子。@davidxxx我看不出它们是如何在同一个结构中混合的:
Transport
是一个可访问的,而
Operation
是一个访问者。您的方式是访问者模式的一种特定形式:)事实上,我的意思是,它忽略了访问者实现背后的接口,该接口允许被访问元素接受任何访问者实现。同样,这是一个很好的例子。