Java 8选择了与涉及仿制药时Java 7不同的超载方法



我有以下测试类:

import java.io.Serializable;
public class Java8Problem {
    public void test(String stringArg) {
        System.out.println("string-Method taken: " + stringArg);
    }
    public void test(Object objectArg) {
        System.out.println("object-Method taken: " + objectArg.toString());
    }
    public <T extends Serializable> T getTestData() {
        return (T) new Integer(10);
    }
    public static void main(String[] arguments) {
        Java8Problem instance = new Java8Problem();
        instance.test(instance.getTestData());
    }
}

当我在Java 7中编译并运行此类时,输出将为:

对象方法:10

但是,当我在Java 8中编译并运行此课时,我会得到一个运行时例外:

线程" main" java.lang.classcastException中的例外: java.lang.integer不能被施放到java.lang.string 在java8problem.main(java8problem.java:21(

所以Java 8似乎采用了最具体的方法,而Java 7采用了最常见的方法。

有人知道这是Java 8中的错误还是改变/所需的行为?如果后者是这样的,是否有可能配置Java 8使用旧行为?还是有其他方法可以解决这个问题?

btw:我知道这里的问题是由方法getTestData的返回类型引起的,但这只是我现实世界中问题的简化示例,我无法轻易更改该方法的签名。

这是一个工作障碍,可以让编译器在Java 8中选择public void test(Object objectArg),从而避免ClassCastException

Java8Problem instance = new Java8Problem ();
instance.test(instance.<Integer>getTestData());

最新更新