В настоящее время мы переносим приложение с Java 7 на Java 8. После устранения некоторых проблем с компиляцией я наткнулся на проблему, похожую на следующий вопрос: ClassCast Error: Java 7 vs Java 8.
Подведем итог, вот пример кода, который показывает проблему:
public class Test {
public static void main(String[] args) {
System.out.println(String.valueOf(getVal("xxx"))); // 7: prints the result, 8: Exception
}
@SuppressWarnings("unchecked")
public static <T> T getVal(String param) {
// do some computation based on param...
return (T) result; // actual return type only depends on param so the caller knows what to expect
}
}
Идея заключалась в том, что мы запустим, что вызывающий абонент знает ожидаемый тип, и это позволит избежать явного приведения (я не говорю, что это была хорошая идея...). Во многих случаях вызывающий абонент просто ожидает Object
, поэтому никакого неявного приведения не было.
Как указано в вышеприведенном вопросе, пример String.valueOf
отлично работал в Java 7, потому что не было вывода типа, поэтому предполагалось Object
. Теперь в Java 8 компилятор выбирает наиболее специфический тип (здесь char[]
), который вызывает ClastCastException
во время выполнения.
Проблема заключается в том, что у нас есть около 350 вызовов этого метода getVal
. Есть ли способ обнаружить перегруженные вызовы методов, которые будут отличаться между Java 7 и Java 8? I.E. определить, когда компилятор Java 8 будет выбирать другой метод из компилятора Java 7.