泛型,一个孤独的守门者
关于泛型的具体细节这篇博客我觉得讲得十分详细,所以我分享一下我学习中的一些难点与体会。
1.学习泛型要先掌握java的类型转换机制java引用数据类型转换,由于继承,java自然的向上转换,父类转换为子类需要特定条件。
2.作用:泛型,就是参数类型化,把一个类型作为参数传递进去,而把他成为守门人,很好的形容了泛型的功能。在没有泛型之前,一般都是用继承,object这个基类来实现但是这样不管加入任何类型都可以,所以需要泛型这个守门人,检测传入的类型,可以在编译阶段查出错误。
1 2 3 4 5 6 7 8
| List arrayList = new ArrayList(); arrayList.add("aaaa"); arrayList.add(100);
for(int i = 0; i< arrayList.size();i++){ String item = (String)arrayList.get(i); Log.d("泛型测试","item = " + item); }
|
崩溃
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
1 2 3
| List<String> arrayList = new ArrayList<String>(); ... //arrayList.add(100); 在编译阶段,编译器就会报错
|
3.类型擦出,理解反省的这个特性才能完全掌握泛型。
泛型信息只存在于代码编译阶段,在进入 JVM 之前,与泛型相关的信息会被擦除掉,。泛型全部转换为object,与普通类没什么区别(如有类型限定则转换为限定类型)所以说,泛型是一个守门人,在编译的时候提醒你传入什么类型,相应的,我们也可以利用反射,我们绕过编译器去调用 add 方法
4.通配符?
Java 泛型通配符和类型限定
关于上限与下限的读取使用说明
我认为很好的例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| public static void count(Collection<? super Integer> ints, int n) { for (int i = 0; i < n; i++) ints.add(i); } public static void main(String[] args) { List<Integer>ints = new ArrayList<>(); count(ints, 5); assert ints.toString().equals("[0, 1, 2, 3, 4]"); List<Number>nums = new ArrayList<>(); count(nums, 5); nums.add(5.0); assert nums.toString().equals("[0, 1, 2, 3, 4, 5.0]"); List<Object>objs = new ArrayList<>(); count(objs, 5); objs.add("five"); assert objs.toString().equals("[0, 1, 2, 3, 4, five]"); }
|