java - 如何检测会导致 Java 8 中的 ClassCastException 的不明确方法调用?

标签 java generics java-8 classcastexception overloading

我们目前正在将一个应用程序从 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/

相关文章:

java - 检测消息更新失败

java - java中的preparedStatement SQL错误

c# - 如何对泛型类型使用运算符

java - 我试图用 Mockito 模拟 Jersey WebResource,但做不到

java - 如何在 Java 8 中使用 lambda 表达式覆盖基类方法?

java - : Expected condition failed: waiting for visibility of element located by(. 的 Selenium webdriver 问题。)

java - 什么是NullPointerException,我该如何解决?

C# 失败的协变转换

Java 8 : How to find kth smallest, 高效

java - 在 Netbeans 8 中找不到/dist 目录