1.JAVA泛型——“适用于许多许多的类型”
(其实应该写在lab 2,不过当时比较懒)
“一般的类和方法,只能使用具体的类型,要么是基本类型,要么是自定义的类型。如果要编写可以应用于多种类型的代码,这种刻板的限制对代码的束缚就会很大”
1.1一个例子
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
ArrayList 可以存放任意类型,例子中添加了一个String类型,添加了一个Integer类型,再使用时都以String的方式使用,因此程序崩溃了。为了解决类似这样的问题(在编译阶段就可以解决),泛型应运而生。
我们将第一行声明初始化list的代码更改一下,编译器会在编译阶段就能够帮我们发现类似这样的问题。
List arrayList = new ArrayList();
//arrayList.add(100); 在编译阶段,编译器就会报错
这个例子很好的向我们解释了为什么需要泛型
1.2特性
泛型只在编译阶段有效
1.2泛型的使用
泛型类 泛型接口 泛型方法
1.2.1泛型类
一个普通的泛型类
//此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型
//在实例化泛型类时,必须指定T的具体类型
public class Generic{
//key这个成员变量的类型为T,T的类型由外部指定
private T key;
public Generic(T key) { //泛型构造方法形参key的类型也为T,T的类型由外部指定
this.key = key;
}
public T getKey(){ //泛型方法getKey的返回值类型为T,T的类型由外部指定
return key;
}
}
泛型的类型参数只能是类类型(包括自定义类),不能是简单类型
即可以是Integer 但不能是int
定义的泛型类,就一定要传入泛型类型实参么?并不是这样,在使用泛型的时候如果传入泛型实参,则会根据传入的泛型实参做相应的限制,此时泛型才会起到本应起到的限制作用。如果不传入泛型类型实参的话,在泛型类中使用泛型的方法或成员变量定义的类型可以为任何的类型。
1.2.2泛型接口
1.2.2.1接口
interface关键字产生一个完全抽象的类,不提供任何具体实现允许创建者确定方法名、参数列表和返回类型
“所有实现了该特定接口的类看起来都像这样”
要让某个类遵循某个特定接口,用implements关键字表示“interface只是外貌,我现在要声明它是如何工作的”