没有Wildcarded通用类参数类型在ObservableSet forEach中丢失

时间:2016-03-17 07:02:03

标签: java generics

我想了解以下内容,以及为什么会如此:

我有一个班级:

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没有影响,所以我想知道为什么没有通配符就会失败?

1 个答案:

答案 0 :(得分:1)

使用泛型时,您可以通过不提供类型参数来选择退出。然后将其称为raw type

现在的线索是:通过选择方法签名中的泛型世界,此方法使用原始类型。这意味着方法type.getProductTypes()现在会在ObservableSet方法中返回原始buildChildActivities。此set类型现在显然不包含任何类型信息,因此编译器必须假定Object