一、关于Integer
- 首先补充下昨天的
- intValue()方法 :以 int 类型返回该 Integer 的值。
Integer方法,在其内部类IntegerCache中缓存了-128到127之间的整数,所有如果是这期间的数,系统不会重新new一个Integer,也就是说两个Integer引用变量所指向的对象是一样的。
如果超过这个数值,那么进行对比返回的就是False.
二、关于通配泛型放的位置
通配符总共有三种类型:1、?:无界通配符 2、? extends 父类 :上界通配符 3、? super 子类 :下界通配符
今早研究了一下,发现了一些问题:
举个例子,父类Animals 子类有Dog和Cat ,Dog有子类SmallDog
在方法外头设置<T>的概念
1 public static <T> void print(T t) { //那么,没有这样的类型来提供使用,怎么办呢? 2 //于是用<T>来声明一种“泛型”,然后参数就可以用T这种泛型来定义,否则没有参数类型没法定义参数 3 System.out.println(t); 4 }
在方法参数里头设置
1 public static void eat(List<? super Dog> animals){ 2 Dog dog = (Dog) animals.get(1); 3 dog.shout(); 4 }
着重分析一下上界通配符和下界通配符,上界通配符可以放在方法体的外头或者直接放在方法的参数,例如
1 public static void eat(List<? extends Animals> animals){ 2 for(Animals an:animals) 3 an.shout(); 4 }
1 public static <E extends Animals> void eat(List<E> animals){ 2 for(Animals an:animals) 3 an.shout(); 4 }
而下界通配符,因为父类不能强转为子类,所有它是混着用的,不能直接<E super 子类>,可以这样<E extends 父类<? super E>>
1 public static void eat(List<? super Dog> animals){ 2 Dog dog = (Dog) animals.get(1); 3 dog.shout(); 4 }
上界通配符:
- ? extends E 名为:向上限定,?代表E及其子类,也可以称之为:泛型固定上边界;
- 当创建集合对象,List<? extends Person> list = new ArrayList<Person>();不能做添加操作,以及其他相关的操作
- 原因:是在你做添加操作的时候,你只知道,你添加数据的上限。但是你无法确定你要添加数据的下限。
- 当你做添加操作的时候,确定你具体添加的是什么类型,子类重写的方法,也必须是该类型的或者该类型的子类。
- 但是,如果你添加的类型,和你的对象(例如:new ArrayList<Person>())中的类型不匹配,在实际操作中是有问题的。
- 故而为了避免这种问题(类型转换异常),干脆不让你操作。
下界通配符:
- 但是 ?super E 向下限定,E及其父类(泛型固定下边界)在做添加的时候是不会有问题的。
- 因为:你泛型的下边界,已经限制。再向集合中添加数据,只能是期本身或者他的子类。
- List<? super Person> list = new ArrayList<Person>();
- 在此只能添加 Person对象,已经Person的子类。
参考链接:
http://blog.csdn.net/baple/article/details/25056169
http://blog.csdn.net/a695571342qqcom/article/details/53437125