【问题标题】:Use Method by Real Type真实类型的使用方法
【发布时间】:2011-10-10 08:01:47
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: java types casting downcast upcasting


    【解决方案1】:

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

    没错。在运行时调用哪个方法,在编译时选择,编译器(通常)无法判断 foo 在运行时将具有哪种类型。

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

    您不能“向下转换为对象”。不过,您可以向下转换为 String。没错,如果你这样做了

    bla((String) foo);
    

    它将调用以String 作为参数的bla(如果foo 不是String,则抛出ClassCastException)。

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

    [...]

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

    这通常称为doublemultiple dispatch,是Java 中不支持的功能。

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


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

    【讨论】:

    • 好的,我可能会通过泛型来实现它,这应该让它保持最简单......(感谢您为类型提供正确的名称!)顺便说一句:是否可以使用访问者模式泛型类型?我有一个A var; 然后使用 bla(var);?
    【解决方案2】:

    是的,您必须使用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() );
    

    【讨论】:

      猜你喜欢
      • 2010-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      相关资源
      最近更新 更多