为什么Java编译器失去构造函数实例化轨道泛型类型的?

TobiP:

给定一个泛型类Test<T>和采取一个构造Class泛型参数的public Test(Class<T> clazz){}为什么没有编译器能够正确推断的构造函数实例化该泛型类型new Test(String.class)

当调用构造函数new Test(String.class),编译器似乎不能推断类型Test<String>

什么是这个原因?使用静态工厂方法,编译器推断正确的类型:

Test.java

class Test<T> {
    public Test(Class<T> clazz) {}

    public static <C> Test<C> create(Class<C> clazz) {
        return new Test<>(clazz);
    }
}
Test<Integer> y = new Test(String.class); // works fine at both compile time and runtime, runtime error occurs when calling another method that relies on the generic type parameter

//Test<Integer> x = Test.create(String.class); // does not compile

TobiP:

作为乔普埃根在他的评论中提到的,问题是使用原始类型省略了钻石操作<>实例化测试类时

//Test<Integer> y = new Test<>(String.class); // doesn't compile
//Test<Integer> y = new Test<String>(String.class); // doesn't compile

Test<String> y = new Test<>(String.class); // compiles with correct types

原始类型的文档

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么Java编译器创建在外部类合成的构造函数?

在Java中实例化泛型类型

Java泛型类型绑定。为什么不编译?

使用泛型类型的Java构造函数

Java泛型错误:来自命令行编译器的不可转换类型

在Java中转换为泛型方法类型变量时出现编译器警告

Java泛型:这里的编译器有什么问题?(“没有唯一的最大实例”)

声明泛型类型时的编译器警告

Java-本地类和泛型,为什么会出现编译器警告?

为什么编译器不推断泛型

跨类型构造函数编写泛型仿函数实例?

有模板化构造函数时,为什么编译器会生成复制/移动构造函数?

为什么编译器不对扩展接口的泛型强制执行返回类型值?

为什么编译器可以与未关闭的泛型一起使用?

为什么C#编译器强制在构造函数中显式初始化所有值类型的字段?

为什么编译器声称泛型即使应有也不实现`Display`?

解决泛型类型约束中的编译器错误

为什么运算符<对于Java泛型有编译器错误?

为什么编译器不能匹配此函数类型?

Java迭代器-为什么泛型类型是可选的

Java泛型-编译器错误

为什么Java编译器在第一个语句super()之后在构造函数中复制实例初始化程序块?

Java实例化泛型类型

为什么这个java接口定义使用编译器接受的泛型?

编译器无法推断泛型类构造函数类型的原因是什么?

为什么编译器不允许从 peek 方法返回的泛型不是可选的?

编译器如何推断泛型方法的类型?

Eclipse Java 编译器推断出错误的泛型类型?

为什么编译器在父构造函数中不理解泛型父类型