我有像
这样的代码for(Object obj : list)
func(obj);
void func(Object o){}
void func(Derived d){}
如果obj
为Derived
,则会调用func(Object)
而不是func(Derived)
。任何人都可以告诉我如何调用func(Derived)
吗?感谢
答案 0 :(得分:1)
对于方法参数,选择的重载取决于对象的编译时类型(在本例中为Object
)。
一种解决方案是使func
成为实例方法,并在Derived
中覆盖它。
然后你可以做
for (Base base : list)
base.func();
如果您不能这样做(例如,因为这些不是您的课程),您必须使用instanceof
支票
for (Object o : list)
if (o instanceof Derived)
func((Derived) o);
else
func(o);
首选方法。
答案 1 :(得分:0)
检查对象是否为派生而不是施放他。 像
这样的东西for(Object obj : list){
if(obj instanceof Derived){
func((Derived) obj);
} else {
func(obj);
}
}
答案 2 :(得分:0)
快速而肮脏的解决方案
for (Object obj: list) {
if (obj instanceof Derived) {
func((Derived) obj);
} else {
func(obj);
}
}
但是这种使用instanceof
通常是代码气味,你的代码可能需要一个重构来使用多态。我的意思是使用Ancestor
方法创建func()
类,并从祖先扩展Derived
,然后使用Ancestor
作为循环变量类型:for (Ancestor obj: list) obj.func();
但可能是你需要做进一步的改进。