【发布时间】:2013-07-26 18:26:13
【问题描述】:
考虑以下几点:
public class Doer {
public static void doStuff(A a) {
System.out.println("a");
}
public static void doStuff(B b) {
System.out.println("b");
}
}
B 延伸 A
还有一个像这样的通用类:
public class NewClass<T extends A> {
public void doSomething(T entity) {
Doer.doStuff(entity);
}
}
如果我按如下方式调用此方法,它会打印“a”
new NewClass<B>().doSomething(new B());
如何让它打印“b”?
提前致谢
编辑:一个肮脏的解决方案是改变
Doer.doStuff(entity);
到
if(entity instanceof B){
Doer.doStuff((B) entity);
}else {
Doer.doStuff(entity);
}
但我正在寻找一个不使用 instanceof 的解决方案,这样当我创建一个扩展 A 的新类时,我不必向 NewClass 添加额外的 if (C intance of A) ... p>
【问题讨论】:
-
您作为实体传递的对象。 A 对象或 B 对象 [父/子]。
-
在 java 中,要调用的方法在编译时而不是运行时解析。这意味着您正在传递
A的某个子类——这是编译器所知道的。doStuff(A a)将始终被调用。 -
我认为您必须检查
doStuff方法中的类型,该方法采用A。 -
@Boris 有没有办法解决这个问题,而无需执行“if (entity instanceof B) Doer.doStuff((B) entity; else Doer.doStuff(entity); ?
-
鉴于这种情况,我想我会将 A/B 差异从 Doer 移出并进入 A 和 B 中的重写方法,并且让 Doer 只有一个 DoStuff(A a) 调用,这样Doer 不知道具体情况,只知道 A 的 API。可能不是你需要的,但不知道细节,这就是我要做的。