java-泛型介绍

参考文章:

java泛型(一)、泛型的基本介绍和使用

java泛型(二)、泛型的内部原理:类型擦除以及类型擦除带来的问题

java泛型(三)、通配符的使用

泛型使用总结

泛型的参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口和泛型方法。

泛型类的定义和使用

一个泛型类(generic class)就是具有一个或多个类型变量的类。定义一个泛型类十分简单,只需要在类名后面加上<>,再在里面加上类型参数:

class Pair<T> {  
    private T value;  
        public Pair(T value) {  
                this.value=value;  
        }  
        public T getValue() {  
        return value;  
    }  
    public void setValue(T value) {  
        this.value = value;  
    }  
}  

现在我们就可以使用这个泛型类了:

public static void main(String[] args) throws ClassNotFoundException {  
        Pair<String> pair=new Pair<String>("Hello");  
        String str=pair.getValue();  
        System.out.println(str);  
        pair.setValue("World");  
        str=pair.getValue();  
        System.out.println(str);  
    }  

泛型接口的定义和使用

定义泛型接口和泛型类差不多,看下面简单的例子:

interface Show<T,U>{  
    void show(T t,U u);  
}  

class ShowTest implements Show<String,Date>{  
    @Override  
    public void show(String str,Date date) {  
        System.out.println(str);  
        System.out.println(date);  
    }  
}  

测试一下:

public static void main(String[] args) throws ClassNotFoundException {  
        ShowTest showTest=new ShowTest();  
        showTest.show("Hello",new Date());  
    } 

泛型方法的定义和使用

泛型类在多个方法签名间实施类型约束。在 List 中,类型参数 V 出现在 get()、add()、contains() 等方法的签名中。当创建一个 Map

public static void main(String[] args) throws ClassNotFoundException {  
        String str=get("Hello", "World");  
        System.out.println(str);  
    }  

    public static <T, U> T get(T t, U u) {  
        if (u != null)  
            return t;  
        else  
            return null;  
    }  

泛型变量的类型限定

类型限定在泛型类、泛型接口和泛型方法中都可以使用,不过要注意下面几点:

  1. 不管该限定是类还是接口,统一都使用关键字 extends
  2. 可以使用&符号给出多个限定
  3. 如果限定既有接口也有类,那么类必须只有一个,并且放在首位置
public static <T extends Comparable&Serializable> T get(T t1,T t2)  

public static <T extends Object&Comparable&Serializable> T get(T t1,T t2)  

泛型中通配符使用

First Header 形式
无限定通配符 < ?>
上边界限定通配符 < ? extends Number>
下边界限定通配符 < ? super Number>

提示:限定通配符总是包括自己

无限定通配符

使用?通配符可以引用其他各种参数化的类型

例子

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

publicclass GernericTest {  
    publicstaticvoid main(String[] args) throws Exception{  
        List<Integer> listInteger =new ArrayList<Integer>();  
        List<String> listString =new ArrayList<String>();  
        printCollection(listInteger);  
        printCollection(listString);  
    }  
    publicstaticvoid printCollection(Collection<?> collection){  
               for(Object obj:collection){  
            System.out.println(obj);  
        }  
    }  
}  

上边界限定通配符

Vector< ? extends 类型1> x = new Vector<类型2>(); 
类型1指定一个数据类型,那么类型2就只能是类型1或者是类型1的子类
Vector< ? extends Number> x = new Vector();//这是正确的
Vector< ? extends Number> x = new Vector();//这是错误的

上边界限定通配符

Vector < ? super 类型1> x = new Vector<类型2>(); 
类型1指定一个数据类型,那么类型2就只能是类型1或者是类型1的父类
Vector< ? super Integer> x = new Vector();//这是正确的
Vector< ? super Integer> x = new Vector();//这是错误的

你可能感兴趣的:(java,泛型)