java泛型"? extends Fruit" 和"? super Fruit"的理解和区别

 假设有3个类,他们的关系如下:

    class Fruit {}
    class Apple extends Fruit {}
    class Jonathan extends Apple{}

1、<? extend Fruit>

? extend Fruit 表示泛型变量:该泛型变量是一个未知类型,只知道这个变量是继承自Fruit类型或者是Fruit类型

所以泛型变量“ ? extend Fruit”不接受任何一种类型给他赋值

List<? extends Fruit> list1 = new ArrayList<Apple>();//Apple可以替换成Fruit,Jonathan

list1.add(new Apple());// error 因为需要传递一个“继承自Fruit”的类型,但不知道实际类型(实际类型有可能是Fruit类型或Fruit的子类型),所以不对

list1.add(new Fruit());// error,同样的不知道应该接受一个怎样的实际类型

list1.add(new Jonathan());// error,同样不对

list1.add(new Object());// error,Object不继承Fruit

但是知道泛型变量是继承Fruit类型的,所以该泛型变量可以赋值给Fruit类型的变量

Fruit f = list1.get(0);// ok,因为“? extends Fruit”泛型变量是继承自Fruit的,所以它也是一个Fruit类型

可以用变量来做一个说明,假设有下面几个变量:

Object object;

Fruit fruit;

Apple apple;

Jonathan jonathan;

可以这样理解泛型变量“ ? extend Fruit” A,则A是Fruit、Apple、Jonathan类型中的某个类型

则赋值语句A=apple;错误,因为变量A可能是Jonathan类型,apple变量不能赋值给Jonathan类型的变量

A=object;A=fruit;同样也是不行的。所以任意一个类型都不能赋值给A变量。

但是反过来,因为知道A是继承自Fruit类型的,所以下面赋值语句是可以的

fruit = A; //ok, 因为apple、fruit、jonathan类型的变量都可以赋值给fruit类型

apple=A;//错误,因为A有可能是Jonathan类型,而Jonathan类型的变量A不能赋值给Apple类型的变量apple

 

2、<? super Apple>

? super Apple 表示泛型变量:该泛型变量是一个未知类型,只知道这个变量是Apple的父类型或Apple类型

所以泛型变量“? super Apple”不能赋值给任何变量(Object类型除外,Object是任意对象的父类是毫无疑问的)

List<? super Apple> list2 = new ArrayList<Fruit>();//Fruit可以改成Apple,Object

Fruit f = list2.get(0);// error 因为泛型变量“? super Apple”有可能是Apple类型、或Apple的父类Fruit、Object类型,所以不能赋值给Fruit类型的变量

Apple a = list2.get(0);// error 同上

Jonathan j = list2.get(0);//error 同上

Object o = list2.get(0);//ok Object是任意类型的父类。

但是知道泛型变量是Apple的父类型,所以Apple类型、Apple的子类型可以赋值给该变量。

注意泛型变量“? super Apple”是一个变量,就跟Apple a = new Apple();中的a变量一样的“变量”

list2.add(new Apple());// ok,add方法的参数变量是一个Apple类型或Apple的父类型,所以可以把Apple对象赋值给它

list2.add(new Fruit());// error

list2.add(new Jonathan());// ok

可以用变量来做一个说明,假设有下面几个变量:

Object object;

Fruit fruit;

Apple apple;

Jonathan jonathan;

可以这样理解泛型变量"? super Apple" A,则A是Object、Fruit、Apple类型中的某个类型

则赋值语句 A=apple;A=jonathan可以

但是赋值A=fruit;错误,因为A可能是Apple类型,而fruit变量不能赋值给Apple类型的变量

赋值A=object也是错的

同样,反过来更明显了,fruit=A;apple=A这样赋值不行,因为A可能是Object类型

 

}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值