java泛型中的下限

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java泛型中的下限相关的知识,希望对你有一定的参考价值。

谁说明下原理,上限就不用了,已经明白,不明白下限有什么好处
楼上到底学没学过泛型?????不知道就别说,我这正郁闷呢

这个要比较起来说明的,设置你所谓的上限下限是在参数声明的时候,其他情况不行
1 首先确定的泛型在new时只能new确定的泛型,且其可以使用add方法添加此类型和其子类的实例
2 如上面说的,这样类型就被定义的死死的,不利于多态,所以才有了<? extends Xxx>这种形式,表示list可以为泛型Xxx或者Xxx的子类型,但是这样也有弊端,就是你不能再用add方法,换句话说这样的泛型只能用来做参数传递读取里面的值,无法添加。
3 那么我还想add怎么办,于是有了<? super Xxx>的形式,这样在作为参数传递时候可以传递Xxx以及Xxx父类型的list进来,但是add只能是Xxx或者Xxx的子类(这个到哪都一样,没什么可说的),至于具体怎么用看你的需求了,好处坏处是参考着来的,谁也没比谁好到哪去,只能说各有各的方式,基本算回答你的问题了,下面的算额外附赠,望采纳
4 List<?> 任何类型可以传递进来,但不能再add
5 List<Object> 只能是类型<Object>,可以add
6 <?>和<? extends Object>意义相同
参考技术A 下界
下界用super进行声明,表示参数化的类型可能是所指定的类型,或者是此类型的父类型,直至Object。

写了点代码,试了一下java泛型,上限和下限的问题。经验不足,讲的不好的地方轻拍。

1.Toy类
package fanxing;

public class Toy



2.SubToy类
?package fanxing;

public class SubToy extends Toy



3.SubToy2类
package fanxing;

public class SubToy2 extends Toy



4.main类
package fanxing;

import java.util.ArrayList;
import java.util.List;

public class main

/**
* @param args
* @throws IllegalAccessException
* @throws InstantiationException
*/
public static void main(String[] args) throws Exception
Toy toy = new Toy();
SubToy subToy = new SubToy();
SubToy subToy2 = new SubToy();

List<? extends Toy> list = new ArrayList<Toy>();//表示所持有对象是Toy子类
List<? extends Toy> list1 = new ArrayList<SubToy>();//表示所持有对象是Toy的子类

// list.add(toy); 错误的 因为list所持有的对象类型上限为Toy,但是他不知道具体持有的对象类型,
// list.add(subToy); 错误的,理由同上
// list.add(subToy2); 错误的,理由同上

// list1.add(toy); 错误的 因为list1所持有的对象类型上限为Toy,但是他不知道具体持有的对象类型,
// list1.add(subToy); 错误的,理由同上
// list1.add(subToy2); 错误的,理由同上

List<? super Toy> list2 = new ArrayList<Toy>();//所持有对象为Toy的超类,下限为Toy,所以可以add() Toy及Toy的子类
list2.add(toy);
list2.add(subToy);
list2.add(subToy2);

// List<? super Toy> list3 = new ArrayList<SubToy>(); 错误的,所持有对象为Toy的超类,下限为Toy,
// 所以不可以超过下限Toy,将ArrayList泛型指定为SubToy

List<? super SubToy> list4 = new ArrayList<Toy>();//所持有对象为SubToy的超类,下限为SubToy ,
//可以将ArrayList泛型指定为Toy
// list4.add(toy); 错误的,因为虽然持有对象为SubToy的超类,但是容器不知道具体的类型是超类还是子类,所以不能放入超类,但是子类的话就可以的
list4.add(subToy);
list4.add(subToy2);

List<? super SubToy> list5 = new ArrayList<SubToy>();//所持有对象为SubToy的超类,下限为SubToy ,
//可以将ArrayList泛型指定为SubToy
// list5.add(toy); 错误的,理由同list4
list5.add(subToy);
list5.add(subToy2);

// List<? super SubToy> list6 = new ArrayList<SubToy2>(); 错误的,所持有对象为SubToy的超类,下限为SubToy ,
// 所以持有的对象可能为Toy,也可能为SubToy ,也就不能将具体的实现的泛型指定为SubToy2



参考技术B 比如在4位系统中0001是1 1001就是-1
在32位系统第一位是0就是正数,是1就是负数
所以在java Integer.MIN_VALUE=-2^31

以上是关于java泛型中的下限的主要内容,如果未能解决你的问题,请参考以下文章

Java泛型中的“超级”和“扩展”有啥区别[重复]

java 泛型中的T和?

Java泛型中的协变和逆变

Java泛型中的通配符

Java泛型中的标记符含义

Java泛型中T和问号(通配符)的区别