我们目前正在将一个应用程序从 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 之间不同的重载方法调用?检测 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。
关于java - 如何检测会导致 Java 8 中的 ClassCastException 的不明确方法调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30517768/