如何检测在Java 8中导致ClassCastException的模糊方法调用?

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
    }
}
Run Code Online (Sandbox Code Playgroud)

我们的想法是,我们会强调调用者知道预期的类型,这将避免他明确的演员(我不认为这是一个好主意......).在很多情况下,调用者只是期望一个,Object所以根本就没有隐式转换.

如上面的问题中所述,该String.valueOf示例在Java 7中运行良好,因为没有类型推断,因此Object被假设.现在在Java 8中,编译器选择最具体的类型(此处char[]),这会导致ClastCastException运行时.

问题是我们有大约350次调用此getVal方法.有没有办法检测Java 7和Java 8之间不同的重载方法调用?IE检测Java 8编译器何时从Java 7编译器中选择不同的方法.

Shi*_*ari 2

更好的选择是:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

它可以在 Java 7 和 Java 8 中运行。