Java 8 выбирает другой перегруженный метод, чем Java 7, когда задействованы дженерики

У меня есть следующий тестовый класс:

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, но это лишь упрощенный пример моей реальной проблемы, в которой я не могу легко изменить подпись этого метода.

Ответ 1

В этом случае, чтобы заставить компилятор выбрать public void test(Object objectArg) в Java 8, тем самым избегая ClassCastException:

Java8Problem instance = new Java8Problem ();
instance.test(instance.<Integer>getTestData());