Java泛型、通配符、类型擦除、pecs

版权声明: https://blog.csdn.net/ZHENZHEN9310/article/details/86247921

1、Java泛型

Java的泛型是JDK1.5时引入的。Java的泛型是伪泛型。

  • 1.泛型类
    在创建实例时,需要为其类型变量赋值
 class A<T>{
    }
  • 2.泛型方法
class A<T>{
        public T fun1(){} 
        public void fun2(T t){} //参数
        //以上两个都不是泛型方法,他们是泛型类里面的一个方法
        
        //发现方法要求需要在方法上有泛型的定义
        public <T> T fun3(){}//此为泛型方法
    }

    class B{
        public <T> fun1(){}//也为泛型方法,泛型方法不一定要在泛型类中
    }
  • 泛型方法和泛型类并没有直接的关系

  • 3.泛型类的使用

   *泛型类中定义的泛型
        >可以在方法的返回值中使用
        >可以在方法的参数中使用
        >可以在局部变量是使用
    class C<T>{
        public T fun1(){ //返回值
            T t = ...//可以的 
            new T()//不可以的,会报错
        }
        public void fun2(T t){} //方法的参数
    }
  • 4.泛型的继承和实现
 *子类不是泛型类:需要给父类传递一个具体的类型常量
        >此时父类中所有的泛型参数都会被此类型常量给替换掉
        
 *子类是泛型类:可以给父类传递一个具体的类型参数,也传递一个泛型参数
    class AA1 extends A<String>{}
    class AA2<E> extends A<E>{}

2、Java泛型通配符?

通配符分类

具体的可以看 java 通配符解惑

  ? :无界通配
  <? extends T>:是指 “上界通配符(Upper Bounds Wildcards)”
  <? super T>:是指 “下界通配符(Lower Bounds Wildcards)”

3、java泛型 类型擦除

Java 的泛型在编译器有效,在运行期被删除,也就是说所有泛型参数类型在编译后都会被清除掉。

List<String>、List<T> 擦除后的类型为 List。
List<String>[]、List<T>[] 擦除后的类型为 List[]。
List<? extends E>、List<? super E> 擦除后的类型为 List<E>。
List<T extends Serialzable & Cloneable> 擦除后类型为 List<Serializable>。

4、pecs

Java 泛型中的PECS原则

生产者(Producer)使用extends,消费者(Consumer)使用super。

上界通配符 Plate<? extends Fruit> 覆盖下图中蓝色的区域。

上界<? extends T>不能往里存,只能往外取

下界Plate<? super Fruit>覆盖下图中红色的区域。

下界<? super T>不影响往里存,但往外取只能放在Object对象里

参考

java 通配符解惑

Java中泛型 类型擦除

Java的泛型和通配符

【Java】泛型中 extends 和 super 的区别?

三句话总结JAVA泛型通配符(PECS)

猜你喜欢

转载自blog.csdn.net/ZHENZHEN9310/article/details/86247921