java t super extends_Java中<? extends T>和<? super T>的总结#

class Food{}

//Lev 2

class Fruit extends Food{}

//Lev 3

class Apple extends Fruit{}

class Banana extends Fruit{}

//Lev 4

class RedApple extends Apple{}

class Plate{

private T item;

public Plate(T t){item=t;}

public void set(T t){item=t;}

public T get(){return item;}

}

extends T>:是指 “上界通配符(Upper Bounds Wildcards)”

不能往里存,只能往外取,set( )方法失效。但取东西get( )方法还有效并且读取出来的东西只能存放在Fruit或它的基类里甚至Object

Plate extends Fruit> p=new Plate(new Apple());

p.set(null);

//不能存入任何元素

p.set(new Fruit());    //Error

p.set(new Apple());    //Error

Object object=p.get();

Food food=p.get();

Fruit fruit=p.get();

Apple apple=p.get();    //Error

RedApple redApple=p.get();    //Error

Banana banana=p.get();    //Error

对于集合少许不一样的地方

List extends Fruit> list1; // list1 的元素在赋值的类型只能是 C 和 C 的子类。

ArrayList a = new ArrayList<>();

ArrayList b = new ArrayList<>();

ArrayList c = new ArrayList<>();

ArrayList d = new ArrayList<>();

ArrayList e = new ArrayList<>();

list1 = a; // 报错

list1 = b;

list1 = c;

list1 = d;

list1 = e;

Object object = list1.get(0);

Food food = list1.get(0);

Fruit fruit = list1.get(0);

Apple apple = list1.get(0);// 报错

RedApple red = list1.get(0);// 报错

Banana banana = list1.get(0);// 报错

add():编译器只知道类型是 Fruit 或 Fruit 的子类,所以有可能是 Fruit Apple RedApple Banana 其中一个类型,为保证类型安全不能添加除了 null 以外的任何元素,即使是 Fruit 本身也不行。

get():既然编译器不知道此时集合中的元素是Fruit Apple RedApple Banana 的哪一个,返回类型只能是他们共同父类 Fruit 或者父类Food类甚至Object。

super T>:是指 “下界通配符(Lower Bounds Wildcards)”

不影响往里存,set( )方法正常。但往外取只能放在Object,对象里get( )方法部分失效,只能存放到Object对象里。

Plate super Fruit> p=new Plate(new Fruit());

//存入元素正常

p.set(new Fruit());

p.set(new Apple());

p.set(new Apple());

p.set(new Banana());

//读取出来的东西只能存放在Object类里。

Object object=p.get();

Food food=p.get();    //Error

Fruit fruit=p.get();    //Error

Apple apple=p.get();    //Error

Banana banana=p.get();    //Error

对于集合少许不一样的地方

List super Fruit> list2; // list2 的元素在赋值的类型只能是 Fruit和 Fruit 的父类。

ArrayList o = new ArrayList<>();

ArrayList a = new ArrayList<>();

ArrayList b = new ArrayList<>();

ArrayList c = new ArrayList<>();

ArrayList d = new ArrayList<>();

ArrayList e = new ArrayList<>();

list2 = o;

list2 = a;

list2 = b;

list2 = c; // 报错

list2 = d; // 报错

list2 = e;// 报错

list2.add(new Object());// 报错

list2.add(new Food());// 报错

list2.add(new Fruit());

list2.add(new Apple());

list2.add(new Banana());

list2.add(new RedApple());

Object objectL = list2.get(0);

Food foodL = list2.get(0);

Fruit fruitL = list2.get(0);

Apple appleL = list2.get(0);// 报错

RedApple redL = list2.get(0);// 报错

Banana bananaL = list2.get(0);// 报错

add():编译器只知道类型是 Fruit 或者 Fruit 的父类,所以有可能是 Fruit Object其中一个类型。编译器知道下界是 Fruit ,根据类型向上兼容所以可以添加的元素是 Fruit 以及 Fruit 的子类

get():既然编译器不确定集合类型是 Fruit Object 的哪一种,返回类型只能是他们的共同父类 Object 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值