1

我了解到我可以使用 Object 的真实类型来定义使用哪个 Method,例如:

[...]
Object foo = new String("hello");
[...]
bla(foo);

void bla(String x){
}
void bla(Integer x){
}

现在它应该采用该bla(String x)方法,但我得到了编译器错误。我知道为什么:因为foo当前的类型是Object. 我不确定我目前是否正确,但我是这样理解的,Java 将通过真实类型(或特定类型)选择方法,所以如果我将其向下转换为Object,它将String选择Object方法已指定。

或者是在方法中确定类型的唯一if(foo instanceof xxx)方法void bla(Object x)?

PS:不要误会我的意思:我不是说我可以重载方法,我的意思是我要根据真实类型(而不是定义的类型)选择方法!

4

2 回答 2

1

现在它应该采用 bla(String x) 方法,但我得到了编译器错误。

正确的。在运行时调用哪个方法,在编译时选择,编译器(通常)不能告诉foo运行时哪种类型。

...所以如果我将其转换为 Object ...

您不能“向下转换为对象”。你可以沮丧到一个String虽然。没错,如果你这样做

bla((String) foo);

它将调用bla以 aString作为参数的 (并抛出 a ClassCastExceptionif foois not a String)。

或者是在 Method void bla(Object x) 中通过 if(foo instanceof xxx) 确定类型的唯一方法?

[...]

我的意思是我想根据实际类型(而不是定义的类型)选择方法!

这通常称为双重多重分派,是 Java 不支持的功能。

如果您确实需要,请实施访问者模式。


顺便说一句,您所说的“定义类型”和“实际类型”通常分别称为静态类型运行时类型。也就是说,Object静态类型foo而是运行String类型

于 2011-10-10T08:06:25.757 回答
0

是的,您必须使用instanceof才能获得真正的类型。bla( Object ) 将始终调用 bla( Object o ) 方法。

注意:基于“真实类型”选择方法仅适用于类方法。对象.方法(...)。如果存在,将根据“真实类型”选择方法(并一直到 Object)。

Object foo = new String("hello");

// this will return "hello" although toString() 
// from Object only prints the reference
System.out.println( foo.toString() );
于 2011-10-10T08:06:13.783 回答