我今天遇到了一个情况,那就是Java没有调用我期望的方法 - 这是最简单的测试用例:(我很抱歉,这看起来很有意思 - “真实世界”的场景要复杂得多, “你为什么会这么做那?”的立场。)Java方法调度如何与泛型和抽象类一起工作?
我特别感兴趣的是为什么会发生这种情况,我不在乎重新设计的建议。我有一种感觉,这是在Java Puzzlers中,但我没有我的副本。
参见下面的试验<Ť> .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
啊......我以为Java泛型编译得更像C++模板。谢谢! – rcreswick 2009-01-17 01:51:47