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对象,而通配符的上下限会被转换成实现类