JAVA泛型

56 阅读2分钟

java泛型类

普通的java泛型类

常用的泛型标识符

T,V,E,K等是常用的泛型标识符,标识符可以自己定义,泛型的类型不能为基本数据类型。即int,double

public class test<T>{
    private T param;
    
    public T get(){//T 表示返回类型
        return this.param;
    }
    public void set(T param){
        this.param=param;
    }
}

泛型类派生子类

即父类是泛型类,子类继承父类

子类为泛型类

如果父类需要使用泛型,则子类与父类的泛型必须保持一致,即标识符必须要有一个保持一致,

public class zi<T> extends fu<T>{
 		//...    
}
//同时子类还可以这么定义

public class zi<T,E,J, S> extends fu<T> {
}

子类为非泛型类

如果子类为非泛型类,如果需要使用父类的泛型,则需要明确指定泛型的具体的类型


public class zi extends fu<String> {
    //...
}

泛型方法

泛型方法相比于泛型类更加灵活,一版也可以与泛型类结合使用,泛型方法需要指定泛型列表,即<E,T,K,V>,

泛型方法的返回值可以是其他类型,但如果需要使用泛型匹配,则必须选择泛型列表所拥有的泛型标识符

泛型方法可以使用static关键词,因为泛型方法的泛型是独立的,不与泛型类中泛型有任何关联

	public static <E, T> E print(E e) {
        System.out.println(e);
        return e;
    }

类型通配符

?的格式称为类型通配符

package com.fx;

import java.util.ArrayList;
import java.util.List;

public class test {
   public static void main(String[] args) {
       ArrayList<animal> cats = new ArrayList<>();
       cats.add(new cat().setName("tom"));
       cats.add(new cat().setName("tom2"));
       cats.add(new cat().setName("tom3"));
       cats.add(new cat().setName("tom4"));
       cats.add(new cat().setName("tom5"));
       cats.add(new cat().setName("tom6"));
       print(cats);
   }

   public static void print(List<?> list) {
       list.forEach(System.out::println);
   }
}

类型通配符上限

格式:<? extends Animal>:

public void test(List<? extends Animal> list){
   
}

通过此方式匹配的数据类型只能为实现类或实现类的子类,其中<? extends Animal>Animal称为实现类

类型通配符下限

格式:<? super cat>:

public void test(List<? super cat> list){
   
}

通过此方式匹配的数据类型只能为实现类或实现类的父类,其中<? super cat>cat称为实现类

泛型擦除

在运行阶段,泛型会被去除,像T会被转换成Object对象,而通配符的上下限会被转换成实现类