当涉及泛型时,Java 8 选择与 Java 7 不同的重载方法

标签 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 中编译并运行此类时,输出将是:

object-Method taken: 10

但是当我在 Java 8 中编译和运行这个类时,我得到一个运行时异常:

Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String at Java8Problem.main(Java8Problem.java:21)

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

有人知道这是 Java 8 中的错误还是它已更改/期望的行为?如果是后者,是否有可能将 Java 8 配置为使用旧行为?还是有其他方法可以解决?

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

最佳答案

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

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

关于当涉及泛型时,Java 8 选择与 Java 7 不同的重载方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48926878/

相关文章:

java - @EJBworkflowDao在服务层为空

unit-testing - 升级到最新版本后 Specs2 规范无法编译

haskell - 在 Haskell 中,两个函数看起来相等但不同

haskell - Fundeps 和 GADT : When is type checking decidable?

Swift 方法重载推理不起作用

c++ - P1787中关于一组非静态成员函数是否可以重载的替代规则

java - 从方法返回后如何停止递归

Java分布式作业监控

java - hibernate 如何将一个实体扩展到所有实体

C++ 错误 C2801 : 'operator =' must be a non-static member