Java 类型推断与删除

标签 java generics type-inference erasure

在删除和类型推断方面存在一些问题。我有以下类层次结构,看起来不是很复杂:

public class Foo<T> {

}

public class Bar<T> {
    private final Class<T> clazz;

    public Bar(Class<T> clazz) {
        this.clazz = clazz;
    }
}

我想做的是这样的:

Bar<Foo<?>> bar = new Bar<>(Foo.class);

这当然是行不通的,因为 Foo 并不完全是 Foo<?> 。问题是如何构建这样一个Bar?我正好需要Bar<Foo<?>> ,不是Bar<Foo> ,因为有一种方法只接受 Bar<Foo<?>>作为参数。欣赏想法。

最佳答案

抱歉,不存在这样的 Class 对象,因为正如您所注意到的,删除意味着不可能存在。您需要转换它:

((Class<Foo<?>>)(Class)Foo.class)

这将为您提供所需的范围,但可能会生成编译器警告,因为您正在执行未经检查的泛型转换。这是合理的:编译器要求您承认您放弃了泛型的编译时安全性。但在这种情况下,这种情况实际上不可能在您的程序中或将来生成运行时错误,所以没关系。

双重转换是必要的,因为编译器知道 Foo.class 与 Class> 不兼容,因此您必须首先将其转换为“原始”类型 Class:在表达式中使用原始类型会禁用编译器的泛型-对该表达式进行类型检查,这样“不可能”的转换就可以正常工作。

关于Java 类型推断与删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33681653/

相关文章:

java - 用于清理 tomcat 目标文件夹和 war 文件的 Maven 插件

java - 使用 SWT 进行快速像素绘图?

java - 使用 JAWS 读取禁用的 JButton

java - 如何在 Java 中创建一个泛型方法,其中参数化类型之一必须实现 Iterable?

java - 有没有比使用单个类更好的方法来提供辅助方法来测试 Web 应用程序?

java - Java 1.8.0_65 的推断类型问题

java - 如何访问 Android 中 Web API 方法的返回值?

Java 泛型与反射

rust - 无法创建 hyper::Client,因为编译器无法推断出足够的类型信息

swift - 任何类型的初始化类(通用函数)