第8章-第1节-Java中的泛型

发布时间:2024年01月11日

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 )

泛型标识含义
TType 类型
EElement 元素
KKey 键
VValue 值

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基础的重点知识点全集》

文章来源:https://blog.csdn.net/jnbbwyth/article/details/135540730
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。