【发布时间】:2013-08-09 14:01:46
【问题描述】:
我想根据对象的类型执行几个操作,而不使用instanceof。起初我在考虑基于类型重载方法(如下所示),并认为也许 Java 会适当地选择方法(基于最具体的对象类)。
import java.util.ArrayList;
import java.util.List;
public class TestA {
public static void main(String[] args)
{
List<Object> list = new ArrayList();
list.add(new A());
list.add(new B());
list.add(new C());
list.add(new Object());
TestA tester = new TestA();
for(Object o: list)
{
tester.print(o);
}
}
private void print(A o)
{
System.out.println("A");
}
private void print(B o)
{
System.out.println("B");
}
private void print(C o)
{
System.out.println("C");
}
private void print(Object o)
{
System.out.println("Object");
}
}
class A {
}
class B extends A {
}
class C {
}
输出是:
Object
Object
Object
Object
但是我想要的输出是:
A
B
C
Object
- 有没有办法让Java根据参数对象的最具体类型来选择方法?
- 如果没有,在没有
instanceof的帮助下,我可以为此类功能寻找哪些替代方案 - 我实际上是在尝试模拟 visitor 模式,但是看起来,visitor 模式起作用的原因是由于双重调度,这使得被“接受”的参数在函数期间处于正确的类型调用,特别是,
class A中的visitor.accept(this)导致函数visitor.accept(A o)被调用。 - 我真的反对
instanceof,因为我读过使用它是不好的做法;在这种情况下,这仍然是不好的做法吗?
【问题讨论】:
-
你的
C类不是扩展B或A吗? -
那么,如果没有
instanceof检查和适当的转换,恐怕你无法做到这一点。不过,让我再看看你的代码。 -
你不能那样做。但看起来你有一个 XY 问题。你到底想达到什么目标?
-
它调用
print(Object)因为你传递了Object。 -
@PatriciaShanahan 我猜
instanceof最适合这种情况。谢谢你的回答。
标签: java polymorphism