Java 8选择了与Java 7在涉及泛型时所做的不同的重载方法

时间:2018-02-22 12:00:01

标签: java type-inference overloading

我有以下测试类:

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方法的返回类型引起的,但这只是我现实世界问题的一个简化例子,我无法轻易改变该方法的签名。

1 个答案:

答案 0 :(得分:0)

这是一个解决方法,让编译器在Java 8中选择public void test(Object objectArg),从而避免ClassCastException

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