Java泛型有什么卵用?

一,什么是java泛型

java泛型是指,在类和方法调用时,指定具体的类型参数(type Parameter),从而实现编译时类型检测,保证运行时类型安全的机制。

支持类型参数调用的类和方法定义方式如下:

将泛型参数声明放在类名后的尖括号中,多个类型参数以逗号分隔。调用时在类名后传具体的类型

声明

public class TestClass<K,V> {
    K key;
    V value;

    public K getKey() {
        return key;
    }

    public void setKey(K key) {
        this.key = key;
    }
}

使用

TestClass<String,Long> = new TestClass<String,Long>();

方法

将泛型参数的声明放在方法返回参数之前的尖括号中,多个类型参数以逗号分隔,类型参数可以被方法参数以及方法内部使用。

调用时在方法前的尖括号中传入具体的类型。

如果类型参数有在方法参数中使用,则可以通过传递的方法参数类型确定具体的类型参数的类型,不需要在方法前的尖括号中指定。

使用方式1:调用方法时在方法名前指定类型参数

定义泛型方法:

public class TestClass {

    public static <M> void testGeneric(M here_We_Used_M_As_Method_ParamType) {
        M abc = here_We_Used_M_As_Method_ParamType;
    }
}

调用:

TestClass.<String>testGeneric("由于类型参数指定为String,所以这里只能传字符串啦,不然编译报错");

使用方式2:当方法参数类型有使用类型参数时,调用方法传递具体的参数,其类型参数的类型也就相当于被指定了。

例子1:

定义泛型方法

public class Test {
    public static <T extends List> T setListValue(T list){
        list.add("a");
        list.add("b");
        return list;
    }
 }

调用:

public static void main(String args[]){
        ArrayList arrayList = new ArrayList();
        ArrayList return_value_is_ArrayList = Test.setListValue(arrayList);//编译正确,由于传递的ArrayList,所以返回也肯定为ArrayList


        LinkedList error = Test.countSize(arrayList);//基于上面的原因,这句会编译失败。
    }

例子2

定义泛型方法:

public class Test {
    public static <T > List<T> newList(Class<T> tClass){
        return new ArrayList<T>();
    }
 }

调用:

public static void main(String args[]){
        List<String> stringList = Test.newList(String.class);//编译正确

        List<Integer> compileError = Test.newList(String.class);//编译失败,因为类型参数在方法参数中被引用,方法被调用时,指定的具体类型参数是String,所以只能返回String类型的list。
    }

二,Java泛型有什么卵用?

卵1:避免转类型导致可能的类型转换错误

如一个盒子类,我们放什么类型,拿出时就是什么类型,不需要类型转换

public class Box<T> {

    T value;

    public T get() {
        return value;
    }

    public void store(T value) {
        this.value = value;
    }
}

使用时:

Box<String> box = new Box<String>();
box.store("我存的是字符串");
String of_course_am_String = box.get();

卵2:限定某一个类或方法可以处理的类型范围

比如一个提供show的舞台,它额show time时间就是歌手唱歌。不管黑人歌手,白人歌手,首先他得是个歌手。不能随便什么人都可以在showTime上场。

歌手类型:

public interface Singer {
    void sing();
}

黑人歌手类型:

public class BlackSinger implements Singer{
    @Override
    public void sing() {
        System.out.println("我正在唱hippop!");
    }
}

提供唱歌的showBar

public class ShowBar {
    public static <T extends Singer> void showTime(T singer) {
        singer.sing();
    }
}

实际表演

ShowBar.showTime(new BlackSinger());//正确执行
ShowBar.showTime(new String());//编译报错,该方法接受的参数只能是Singer的子类

三,参考资料

http://www.tutorialspoint.com/java/javagenerics.htm
https://en.wikipedia.org/wiki/Generics
in_Java