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泛型中的下限的主要内容,如果未能解决你的问题,请参考以下文章