java泛型基类list_泛型:列表<?扩展Animal>与List <Animal>相同吗?

使用List,您知道所拥有的绝对是动物列表。实际上,所有这些都不一定完全是“动物”,它们也可以是派生类型。例如,如果您有动物清单,那么一对夫妇可能是山羊,其中一些可能是猫,等等,对吗?

例如,这是完全有效的:

List aL= new List();

aL.add(new Goat());

aL.add(new Cat());

Animal a = aL.peek();

a.walk(); // assuming walk is a method within Animal

当然,以下将不会是有效的:

aL.peek().meow(); // we can't do this, as it's not guaranteed that aL.peek() will be a Cat

使用List extends Animal>,您可以声明要处理的列表的类型。

例如:

List extends Animal> L;

实际上,这不是 L可以容纳的对象类型的声明。这是关于L可以引用哪些列表的声明。

例如,我们可以这样做:

L = aL; // remember aL is a List of Animals

但是现在,所有编译器都知道L是它是[Animal或Animal的子类型]的列表

因此,以下内容无效:

L.add(new Animal()); // throws a compiletime error

因为据我们所知,L可能引用的是山羊列表-我们无法在其中添加动物。

原因如下:

List gL = new List(); // fine

gL.add(new Goat()); // fine

gL.add(new Animal()); // compiletime error

在上面,我们试图将动物铸造为山羊。那是行不通的,因为这样做之后,如果我们试图让Animal像山羊一样做“头撞”怎么办?我们不一定知道动物可以做到这一点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: <? extends Father> 这种写法的意思是,List 中可以存放 Father 类及其子类的对象,而 Father 类型的对象则不能存放进去。 这个写法可以让 List 变得更加灵活,可以存放任意 Father 类型及其子类的对象,比如 Father 的子类 Son、GrandSon 等等。 ### 回答2: 在Java泛型中,List<? extends Father>这样写的用途是为了使List能够接受Faher类及其子类的对象。?表示一个不确定的类型,而extends关键字限定了该类型必须是Father类或其子类。 使用List<? extends Father>的好处是能够提供更大的灵活性和可复用性。例如,假设有一个List<? extends Number>的列表,我们可以将其赋值为一个List<Integer>或List<Double>的对象,这样做可以使该列表接受更多不同类型的Number及其子类的对象。 另一个好处是能够实现协变。在Java中,数组是不可协变的,即不能将Integer数组赋值给Number数组。但是,使用List<? extends Father>创建的列表可以实现协变,即可以将List<Father>赋值给List<? extends Father>。这样做的好处是可以在方法参数中接受更多不同类型的Father及其子类的对象。 然而,使用List<? extends Father>也有一些限制。由于不确定具体的类型是Father的哪个子类,只能读取元素,而不能修改或添加元素。因为无法确定具体的类型是什么,所以在编译时期无法确定是否为合法的操作。这是为了保证类型安全和类型一致性。 综上所述,使用List<? extends Father>的好处在于提供了更大的灵活性和可复用性,实现了协变,同时也限制了对元素的修改和添加操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值