我有一个接口和2个实现它的类,第三个类有2个方法 - 一个获取第一个类对象作为参数,第二个获取另一个。我有一个包含两种类型对象的向量,我想在每个元素上使用第三个函数的方法而不必转换类型,因为我不知道每个向量元素是什么类型。我怎样才能做到这一点?这是代码:
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循环中创建的。
答案 0 :(得分:5)
在编译器不知道表达式的运行时类型的情况下,您尝试使用方法重载。
具体来说,编译器不知道t[0]
是Car
还是Bike
,因此会发出错误。
您可以通过撤消通话来解决此问题:给Transport
方法拨打operate
,然后再拨打电话:
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);
这种技术通常称为Visitor Pattern。