Сегодня я столкнулся с ситуацией, когда 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