Did*_*r L 11 java generics overloading classcastexception java-8
我们目前正在将应用程序从Java 7迁移到Java 8.在修复了一些编译问题之后,我偶然发现了类似于以下问题的问题:ClassCast错误:Java 7与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之间不同的重载方法调用?IE检测Java 8编译器何时从Java 7编译器中选择不同的方法.
更好的选择是:
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(T param) {
        // do some computation based on param...
        return   param; // actual return type only depends on param so the caller knows what to expect
    }
}
它可以在 Java 7 和 Java 8 中运行。