У меня есть следующий тестовый класс:
import java.io.Serializable;
public class Java8Problem {
public void test(String stringArg) {
System.out.println("string-Method taken: " + stringArg);
}
public void test(Object objectArg) {
System.out.println("object-Method taken: " + objectArg.toString());
}
public <T extends Serializable> T getTestData() {
return (T) new Integer(10);
}
public static void main(String[] arguments) {
Java8Problem instance = new Java8Problem();
instance.test(instance.getTestData());
}
}
Когда я компилирую и запускаю этот класс в Java 7, вывод будет:
объект-принятый метод: 10
Но когда я компилирую и запускаю этот класс в Java 8, я получаю исключение во время выполнения:
Исключение в потоке "main" java.lang.ClassCastException: java.lang.Integer нельзя передать в java.lang.String на Java8Problem.main(Java8Problem.java21)
Итак, Java 8, по-видимому, использует наиболее специфический метод, тогда как Java 7 занимает наиболее частое.
Кто-нибудь знает, является ли это ошибкой в Java 8, или это измененное/желаемое поведение? Если последнее имеет место, есть ли возможность настроить Java 8 на использование старого поведения? Или есть ли другой способ решить это?
BTW: Я знаю, что проблема здесь вызвана возвращаемым типом метода getTestData, но это лишь упрощенный пример моей реальной проблемы, в которой я не могу легко изменить подпись этого метода.