私は今日、Javaが期待した方法を呼び出さなかった状況に遭遇しました-これが最小限のテストケースです:(これは不自然に思われるのが残念です-「現実世界」のシナリオはかなり複雑で、はるかに理にかなっています「どうしてそんなことをするの?」という観点から。)
私はこれがなぜ起こるのか特に興味があります、私は再設計の提案を気にしません。これはJavaパズルにあるような気がしますが、コピーが手元にありません。
以下のTest<T>.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