作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我今天遇到了 Java 没有调用我预期的方法的情况——这是最小的测试用例:(很抱歉这看起来是人为的——“现实世界”的场景要复杂得多,并且从“你到底为什么要那样做?”的角度来看更有意义。)
我特别感兴趣的是为什么会这样,我不关心重新设计的建议。我感觉这是在 Java Puzzlers 中,但我手边没有副本。
在下面的 Test
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/
我是一名优秀的程序员,十分优秀!