当前位置: 首页 > 图灵资讯 > 技术篇> Java泛型中的List

Java泛型中的List

来源:图灵教育
时间:2025-03-19 17:08:38

对java泛型中的listt进行深入了解 extends base>

本文将详细回答java泛型中的listt extends base>使用问题。 在java中,泛型提供了强大的类型安全机制,但其一些特点也容易引起混淆,如listt extends base>开发者经常感到困难。

假设sub是base的子类:

public class base {
}

public class sub extends base {
}

理解list super base>相对容易:

list<? super base> list1 = new arraylist<>();
list1.add(new sub());
list1.add(new base());

list1可以接受base及其子类的例子。这是因为 super base表示list中的元素类型是base的超级类型(包括base本身)。 任何base的子类都可以向上转换为base或其超级类型,因此允许添加操作。

立即学习“Java免费学习笔记(深入);

然而,list extends base>行为完全不同:

list<? extends base> list2 = new arraylist<>();

为什么我们不能给list2添加任何元素,即使是base实例? 这并不是因为子类不能相互转换,关键在于list extends base>的含义。

list extends base>这意味着这是一个列表,它的元素类型是base的子类型,但我们无法确定这个类型是base本身还是sub,甚至其他继承自base的类别。 这意味着编译器无法验证添加任何元素的操作是否安全。 如果我们试图添加一个base对象,编译器不能保证list的实际类型(可能是list)能够容纳base对象。 同理,添加sub对象也存在同样的问题,因为list的实际类型可能不是list。

为了更好地理解,我们可以参考以下示例:

class Bag<T> {
    public void set(T t) {}
    public T get() { return null; }
}

class Fruit {}
class Apple extends Fruit {}
class Pear extends Fruit {}

// ...  (Bag类的使用示例与答案一致) ...

这个例子清楚地显示出来 extends和? super对阅读和写作操作的限制加深了我们对list的限制 extends base>理解,它只允许读取操作,而不允许写入操作。由于编译器在编译过程中无法确定列表的实际类型,任何写入操作都可能导致操作异常。

以上是Java泛型List的详细内容,请关注图灵教育的其他相关文章!