java 泛型

泛型,一个孤独的守门者

关于泛型的具体细节这篇博客我觉得讲得十分详细,所以我分享一下我学习中的一些难点与体会。

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]");
}
© 2020 WPY's Android Tour All Rights Reserved. 本站访客数人次 本站总访问量
Theme by hiero