我试图理解以下内容,以及为什么会这样:
我有一堂课:
public abstract class ProducerType<T extends BulkItem> extends SomeClass<T> {
public ObservableSet<ProductType> getProductTypes() {
return productTypes;
}
}
在另一个类中,我有一个方法:
private void buildChildActivities(ProducerType<?> type) {
type.getProductTypes().forEach((ProductType pt) -> {
// do stuff
});
}
我最初缺少此方法的ProducerType
参数<?>
,因此它是:
private void buildChildActivities(ProducerType type) {
这导致 forEach 中返回的成员类型在 lambda 消费者中丢失。<T>
泛型对 ProducerType
中定义的方法或它返回的 Set 没有影响,所以我想知道为什么没有通配符它会失败?
使用泛型时,您可以通过不提供类型参数来选择退出。这称为原始类型。
现在的线索是:通过在方法的签名中选择退出泛型世界,此方法完全使用原始类型。这意味着该方法现在type.getProductTypes()
在 buildChildActivities
方法中返回原始ObservableSet
。这个集合类型现在显然不包含任何类型信息,因此编译器必须假定Object
。