当前位置: 首页 > 知识库问答 >
问题:

为什么Java编译器在构造函数实例化中失去了对泛型类型的跟踪?[副本]

饶谦
2023-03-14

给定一个泛型类Test 和一个采用泛型参数public Test(class clazz){} class的构造函数,编译器为什么不能正确推断构造函数实例化new Test(string.class)的泛型类型

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

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

共有1个答案

隆飞宇
2023-03-14

正如Joop Eggen在他的评论中提到的,问题是在实例化测试类时省略了diamond运算符<>而使用了raw类型

//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

原始类型文档

 类似资料:
  • 问题内容: 我正在使用泛型编写某些东西,令我惊讶的是,我发现这行不通: 那我不能实例化泛型吗?没有任何方法可以做到这一点吗? 问题答案: 是的,这真是令人讨厌。 我使用的解决方法是强制客户端在构造新类时传递类-即 然后您可以使用。

  • 问题内容: 我想创建一个KeyValue类,但以通用方式,这就是我写的内容: 错误显示:“令牌“>上的语法错误”,此令牌后应有标识符” 那我该如何在Java中创建一个通用构造函数呢? 问题答案: 您需要从构造函数的签名中删除:它已经隐式存在。

  • 问题内容: 我想在Java中创建泛型类型的对象。请提出如何实现相同的建议。 注意:这似乎是一个简单的泛型问题。但是我打赌..不是。:) 假设我的类声明为: 问题答案: 你必须添加异常处理。 你必须在运行时传递实际类型,因为它不是编译后字节码的一部分,因此,没有显式提供它就无法知道它。

  • 问题内容: 众所周知,您可以使用类型参数在Java中创建一个通用类: 但是,您也可以使用泛型 构造函数 ,这意味着显式接收其自己的泛型类型参数的构造函数,例如: 我正在努力了解用例。这个功能让我做什么? 问题答案: 这个功能让我做什么? 它至少可以让您完成 三 件事,而这 三 件事是您无法做到的: 表达参数类型之间的关系,例如: } <撤回> 正如@Lino首先观察到的那样,它使您可以表达参数必须

  • 问题内容: 如果我有一个像这样的抽象类: 还有一些从Item派生的类是这样的: 我不明白为什么我不能使用泛型调用构造函数: 我知道可以有一个没有构造函数的类型,但是这种情况是不可能的,因为Pencil具有没有参数的构造函数,而Item是抽象的。但是我从eclipse中得到了这个错误: 无法实例化 我不明白为什么的 T类型 ,以及如何避免这种情况? 问题答案: 无法使用Java类型系统来强制类层次结

  • 问题内容: 我知道Java的泛型在某种程度上逊于.Net。 我有一个泛型类,我确实需要使用无参数构造函数实例化。如何解决Java的局限性? 问题答案: 一种选择是传递(或你感兴趣的任何类型-以任何方式指定适当的引用)并将该值保留为字段: 另一种选择是具有“工厂”接口,然后将工厂传递给泛型类的构造函数。这更加灵活,你无需担心反射异常。