gpt4 book ai didi

java - Java 方法分派(dispatch)如何与泛型和抽象类一起工作?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:17:00 26 4
gpt4 key购买 nike

我今天遇到了 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++ 不同,因为它最终会根据需要创建代码的多个编译版本。

关于java - Java 方法分派(dispatch)如何与泛型和抽象类一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/452635/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com