在删除和类型推断方面存在一些问题。我有以下类层次结构,看起来不是很复杂:
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/