我想了解以下内容,以及为什么会如此:
我有一个班级:
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) {
导致lambda Consumer中forEach中返回的成员类型丢失。 <T>
泛型对ProducerType
中定义的方法或它返回的Set没有影响,所以我想知道为什么没有通配符就会失败?
答案 0 :(得分:1)
使用泛型时,您可以通过不提供类型参数来选择退出。然后将其称为raw type。
现在的线索是:通过选择方法签名中的泛型世界,此方法使用原始类型。这意味着方法type.getProductTypes()
现在会在ObservableSet
方法中返回原始buildChildActivities
。此set类型现在显然不包含任何类型信息,因此编译器必须假定Object
。