当前位置: 首页 > 面试题库 >

Java方法分派如何与泛型和抽象类一起使用?

宫晟
2023-03-14
问题内容

我今天遇到了一种情况,其中Java没有调用我期望的方法-
这是最小的测试用例:(很抱歉,这似乎是人为设计的-“现实世界”场景要复杂得多,并且更有意义从“究竟为什么会怎么做 ?”的立场。)

我对为什么会发生这种情况特别感兴趣,我不在乎重新设计的建议。我觉得这是Java Puzzlers中的功能,但是我没有副本。

请参见下面的Test .getValue()中的特定建议问题:

public class Ol2 {

    public static void main(String[] args) {  
        Test<Integer> t = new Test<Integer>() {  
            protected Integer value() { return 5; }  
        };

        System.out.println(t.getValue());  
    }  
}


abstract class Test<T> {  
    protected abstract T value();

    public String getValue() {  
        // Why does this always invoke makeString(Object)?  
        // The type of value() is available at compile-time.
        return Util.makeString(value());  
    }  
}

class Util {  
    public static String makeString(Integer i){  
        return "int: "+i;  
    }  
    public static String makeString(Object o){  
        return "obj: "+o;  
    }  
}

此代码的输出是:

obj: 5

问题答案:

不,值的类型在编译时不可用。请记住,javac将仅编译该代码的一个副本以用于所有可能的T。鉴于此,编译器在getValue()方法中使用的唯一可能类型是Object。

C 不同,因为C 最终会根据需要创建代码的多个编译版本。



 类似资料:
  • 在java中,是否可以使用通配符定义抽象方法,但在实现中使用具体类型 eg: 在这样的抽象类中定义抽象方法 实现如下抽象方法,其中CorporateServer扩展了用户:

  • 我有这样的抽象类: 我还有一个扩展抽象的类:

  • 在我的Spring Boot应用程序中,我尝试实现模板方法,在我的具体类中,我尝试使用泛型,如下所示: 模板界面:不确定我是否需要使用它? 模板抽象类: 混凝土等级: 我在dto中得到“无法解析‘T’中的方法‘getName’”。getName()行输入AbstractPDFGenerator。 我的问题是: 1.为了解决这个问题,我想从继承和的基类扩展T。但是,我不想从基类继承它们,因为它们没有

  • “绑定不匹配:Team类型不是league类型 的有界参数 >的有效替代品。”

  • 它是关于java中具有两种泛型类型(一种用于返回类型,另一种用于形式参数)的泛型方法以及如何实现它。我想我在图片中缺少一些东西来让它工作。 事情是这样的... 这是工作 : 这不起作用: java编译器告诉我: 好吧,就是这样。提前感谢大家!希望它能在未来帮助别人! P、 D:这不是枚举类型的问题。它发生在类和层次结构之间。所以别怪Enum了,我试过了,但没用。 对于泛型参数 我们可以做一个一般规