没有通配符的泛型类参数类型在 ObservableSet for Each 中丢失



我试图理解以下内容,以及为什么会这样:

我有一堂课:

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

最新更新