1、泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用。什么是泛型?为什么要使用泛型?
List arrayList = new ArrayList();
arrayList.add("aaaa");
arrayList.add(100);
for(int i = 0; i< arrayList.size();i++){
String item = (String)arrayList.get(i);
System.out.println(item);
}
2、概念:在类声明体中用到了类型参数。
/*
class 类型名<泛型标识,泛型标识, ...>{
private 泛型标示 变量名;
}
*/
public class GenericDemo<T> {
private T key;
public GenericDemo(T key) {
this.key = key;
}
public T getKey() {
return key;
}
public void setKey(T key) {
this.key = key;
}
public static void main(String[] args) {
/*
类名<具体的数据类型> 对象名 = new 类目<具体的数据类型>();
JDK1.7后,可以省略成这样:
类名<具体的数据类型> 对象名 = new 类目<>();
*/
GenericDemo<Integer> integerGenericDemo = new GenericDemo<>(10);
GenericDemo<String> stringGenericDemo = new GenericDemo<>("abc");
//如果没有指定具体的数据类型,此时,操作类型是Object
GenericDemo genericDemo = new GenericDemo("genericDemo");
System.out.println(integerGenericDemo.key);
System.out.println(stringGenericDemo.key);
System.out.println(genericDemo.key);
//泛型类型在逻辑上可以看成是多个不同的类型,但实际上是相同类型
System.out.println(integerGenericDemo.getClass()==stringGenericDemo.getClass()); //输出结果为true
}
}
3、泛型类只支持类类型,不支持基本数据类型(如int),但可以用包装类(如Integer )
泛型标识 | 含义 | |
---|---|---|
T | Type 类型 | |
E | Element 元素 | |
K | Key 键 | |
V | Value 值 |
4、泛型类的继承:
1)、子类也是泛型类,子类和父类的泛型标识要一致。子类也可以扩展泛型标识,但子类中至少有一个泛型标识与父类相同;
2)、子类不是泛型类,父类要明确泛型的数据类型;
//1.子类也是泛型类,子类和父类的泛型标识要一致
class Child<T> extends Parent<T>{}
//也可以扩展,但子类中至少有一个泛型标识与父类相同
class Child<T,E> extends Parent<T>{}
//2.子类不是泛型类,父类要明确泛型的数据类型
class Child extends Parent<String>{}
?5、泛型方法:
泛型类和泛型方法的区别 | ||
---|---|---|
泛型类 | 实例化类的时候指明泛型的具体类型 | |
泛型方法 | 调用方法的时候指明泛型的具体类型 |
修饰符 <T,E,...> 返回值类型 方法名(形参列表){
方法体...
}
1)、?public 和 返回类型中间的标识符,可以理解为,声明该方法为泛型方法;
2)、只有声明了的方法是泛型方法,泛型类中的未申明的成员方法不是泛型方法;
3)、表明,该方法使用泛型类型T,可以使用在返回类型,传入参数列表,方法体里;
public class GenericDemo<T> {
public static <E> void print(E... e){
for(int i = 0; i < e.length; i++){
System.out.println(e[i]);
}
}
public static void main(String[] args) {
GenericDemo.print(1,2,3,4,5);
GenericDemo.print("a","b","c");
}
}
6、泛型总结:
泛型代码层面: 1): 集合 List<String> 限制集合内元素类型 2):泛型类和泛型方法 : 提高方法或者类的灵活度 , 设计度 目的:能让一个方法或者类 干跟多 相似的业务!!! 理论层面: 1): 继承 : 1> 子类 继承 泛型父类 , 1.1> 如果子类也是泛型类,那么至少要有一个标识和父类相同 子类也可以有自己的泛型标识 1.2> 如果子类不是泛型类,那么在继承/实现的时候,就要指定 父类的泛型标识的数据类型!!! 如果不指定,编译器会按照 Object 处理!!! 2): 为什么编译会按照Object 来处理 泛型擦除:泛型 只会在 编译的时候起作用, 在编译完成后,JAVA虚拟机在运行时将会擦除所有的泛型标识 , 这个时候,如果没有给定泛型标识的类型,那么就会按照Object处理!!!
本电子书目录:《Java基础的重点知识点全集》