我有一些带有相同接口(interface)类型的不同对象的数组列表,例如:
Interface interface {}
class A implements interface {}
class B implements interface {}
我还有一个重载方法,用于实现接口(interface)的所有继承对象:
public void doSomething(A obj) {}
public void doSomething(B obj) {}
编译器还强制我使用接口(interface)编写重载方法:
public void doSomething(interface obj) {}
然后我遍历列表的值并调用方法:
for (interface obj: myList) {
doSomething(obj);
}
现在,由于 obj 的类型是“interface”,因此如果 obj 实际上是 B 类型,则调用 doSomething(interface obj) 而不是 doSomething(B obj)。
我可以让java做其他事情吗,这样当obj的类型为A时它调用doSomething(A obj),当obj的类型为B时它调用doSomething(B obj)?
最佳答案
Java 使用早期绑定(bind),这意味着 obj 的类型是在编译期间定义的,而不是在运行时定义的。由于您的代码表明 obj 是接口(interface)类型,因此编译器将始终调用以接口(interface)作为参数的方法。
您有两种选择让它调用正确的方法:
(非常难看)在调用对象时使用instanceof和cast检查obj类型。
for (interface obj: myList) { if(obj instanceof A) doSomething((A) obj); else if(obj instanceof B) doSomething((B) obj); else doSomething(obj); // Calls the method receiving Interface }
在接口(interface)中实现一个访问者方法,这样A和B在访问时都会调用方法doSomething(this)。
interface Interface { void visit(OtherClass methodHolder); } class A implements Interface { public void visit(OtherClass methodHolder) { methodHolder.doSomething(this); } } class B implements Interface { public void visit(OtherClass methodHolder) { methodHolder.doSomething(this); } }
关于java - 在java中的重载方法中使用更具体的数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1835310/