Java泛型——NWU_LK

泛型类和泛型接口

泛型标注在类名后边,例如

public class A<T> {
	public String Name;
	public T t;
	public A(String name,T t)P{
		this.name=name;
		this.t=t;
	}
}
public static void main(String args[]){
	A<String> aa = new A<>(); 
}

在实例化对象时,如果未指明泛型的类型,那么会默认泛型为Object类型。

子类继承了父类时,有如下几种泛型的定义方式

public class father<K,V>{}
//擦除父类的泛型
public class son extends father {}
//实现
public class son extends father<String,Integer> {}
//保留全部泛型
public class son<K,V> extends father<K,V> {}
//保留部分泛型
public class son<V> extends father<String,V> {}

注意:静态方法中不能使用泛型,异常类不能申明为泛型。

泛型方法

泛型方法不一定要在泛型类中,并且法可以声明为静态方法,定义格式如下:

public <E>E[] get(E[] e){}

通配符的使用

为什么需要通配符?因为以下语句会报错,不能直接将泛型集合类赋给对应的局部变量。

public class GernericTest {
    public static void main(String[] args) throws Exception{
        List<Integer> listInteger =new ArrayList<Integer>();
        List<String> listString =new ArrayList<String>();
        printCollection(listInteger);
        printCollection(listString);    
    } 
    public static void printCollection(Collection<Object> collection){
        for(Object obj:collection){
            System.out.println(obj);
        }  
    }
}
  • 无边界的通配符

采用<?>的形式,比如 List<?>,无边界的通配符的主要作用就是让泛型能够接受未知类型的数据。通过该方案可以解决以上问题。在方法 printCollection(Collection<?> collection) 中不能出现与参数类型有关的方法比如 add方法; 。因为程序调用这个方法的时候传入的参数不知道是什么类型的,但是可以调用与参数类型无关的方法比如size方法 。

public class GernericTest {
    public static void main(String[] args) throws Exception{
        List<Integer> listInteger =new ArrayList<Integer>();
        List<String> listString =new ArrayList<String>();
        printCollection(listInteger);
        printCollection(listString);
    }
    public static void printCollection(Collection<?> collection){
        for(Object obj:collection){
            System.out.println(obj);
        }
    }
}
  • 固定上边界的通配符

使用固定上边界的通配符的泛型,就能够接受指定类及其子类类型的数据。要声明使用该类通配符,采用<? extends E>的形式,这里的 E 就是该泛型的上边界。

  • 固定下边界的通配符

使用固定下边界的通配符的泛型,就能够接受指定类及其父类类型的数据。要声明使用该类通配符,采用<? super E>的形式,这里的 E 就是该泛型的下边界。


版权声明:本文为NWU_LK原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。