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编译器中选择不同的方法.
更好的选择是:
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 中运行。
| 归档时间: |
|
| 查看次数: |
437 次 |
| 最近记录: |