【问题标题】:Java method with lower bounded(super) type具有下界(超级)类型的 Java 方法
【发布时间】:2016-11-09 12:03:33
【问题描述】:

例如,我有下一个类,有界类型参数:

public class ItemContainer<T> {
    void addItems(List<T> items);
}

在另一个类中使用参数:

public class ItemsGenerator<T> {
    public void putItems() {
        ItemContainer<? super T> itemContainer = getItemContainer();
        List<? super T> items = getItems();
        itemContainer.addItems(items); // compilation error!
    }
}

据我了解,问题在于第一个(ItemContainer)通用参数是否与第二个(List)相同是未知的。好的解决方案可能是为方法定义通用的下限类型:

public <S super T> void putItems() {
    ItemContainer<S> itemContainer = getItemContainer();
    List<S> items = getItems();
    itemContainer.addItems(items); // ok
}

但是,令人惊讶的是(就我而言),没有这样的语法( slightly unconvincing reason)!
有没有办法解决这个问题?我确信(在我的情况下)第一个和第二个参数是相同的,但我不知道如何向 Java 解释它。

【问题讨论】:

    标签: java generics methods parameters wildcard


    【解决方案1】:

    您是对的,Java 不允许这样做,因为两个实例虽然具有相同的 super,但可能不属于同一类,因此避免了运行时异常。既然您确定它们将始终属于同一类,为什么不在 itemContainer 和 items 中使用相同的 Type?

        ItemContainer<T> itemContainer = new ItemContainer<>();
        List<T> items = new ArrayList<>();
    

    【讨论】:

    • 因为itemContainer和items的泛型类型参数应该是T的超类型(定义在类头)。
    • @DenisDorohov: “T 的超类型” 没有T 的“超”类型。 ? super T 表示可以是T 的任何超类型,包括T 本身、T 的直接超类、该类的超类等(包括任何实现的接口等)到Object
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 2020-11-05
    • 2018-04-03
    • 2011-10-15
    • 1970-01-01
    • 2014-05-08
    相关资源
    最近更新 更多