1.泛型程序设计(Generic programming) :使用泛型编写的代码可以被很多不同类型的对象所重用。
2.泛型的好处:可读性好,易维护;
2.1 非泛型示例:
//使用继承来实现泛型,不使用泛型类ArrayList<E>
//创建一个简单的arraylist类,带有增和查方法
public class arraylist {
private Object[] element = new Object[10];
private int c = 0;
public void add(Object o) {
element[c++] = o;
}
public Object get(int i) {
return element[i];
}
}
public class test {
public static void main(String[] args) {
arraylist al = new arraylist();
al.add("hi");
al.add("123");
// array.add(123);//输入123,编译不会报错
String str = (String) al.get(1);
System.out.println(str);
}
}
console结果:
123
分析:可以发现通过继承方式,有两个问题:
1.使用get()查询时返回的是Object对象,需要进行强制转换为String;
2.使用add()添加元素时编译器不会错误检查,任何对象都可以输入进去,运行后才会报错;
2.2 泛型示例:
public static void main(String[] args) {
ArrayList<String> array = new ArrayList<String>();
array.add("hi");
array.add("123");
// array.add(123);//输入123,编译会报错
String str = array.get(1);
System.out.println(str);
}
console结果:
123
分析:
1.当调用 get 的时候,不需要进行强制类型转换,编译器就知道返回值类型为 String,而不是 Object ;
2.编译器可以进行检査,避免插人错误类型的对象;
3.泛型类
示例:
//定义一个简单的泛型类,类型变量 T和U,用尖括号 ( < >) 括起来,并放在类名的后面
public class Model<T,U> {
private T first;
private U second;
public Model() {
first = null;
second = null;
}
public Model(T first, U second) {
super();
this.first = first;
this.second = second;
}
public T getFirst() {
return first;
}
public void setFirst(T first) {
this.first = first;
}
public U getSecond() {
return second;
}
public void setSecond(U second) {
this.second = second;
}
}
//测试泛型类
public class demo {
public static void main(String[] args) {
Model<String, Integer> ts = new Model<String,Integer>();
ts.setFirst("字符串");
ts.setSecond(123);
System.out.println(ts.getFirst() + ts.getSecond());
}
}
注意:
- 在 Java 库中,使用类型变量变量 E 表示集合的元素类型、K 表示表的关键字、V 表示值的类型、T ( 需要时还可以用临近的字母 U和 S) 表示“ 任意类型”。
- Java泛型类和C++模板类有本质区别;
4.泛型方法