java泛型的讨论

来源:互联网 发布:飞机升阻比知乎 编辑:程序博客网 时间:2024/06/05 20:54

一.泛型的使用

List<Integer> list = new LinkedList<Integer>();
list.add(new Integer(0));
list.add("Str");           //编译错误
Integer x = list.get(0)

二.泛型类

public class Prt<T>{
    public void print(T t){
        System.out.println(t);
    }
}

三.泛型方法

可以单独将方法编写为泛型方
public <T> void prt(T bean){   ...}

四.泛型与数组

数组与泛型不能很好的集成
无法创建泛型数组T[] arr = new T[10];//error但是可以强制转型T[] arr = (T[])new Object[10];

五.擦除

Java中的泛型使用的是擦除技术来实现

其实就是为了提高安全性,而在编译时多做了一些检查

泛型在编译后将会消失,在运行时和不使用泛型时没有任何区别

public class Test1{

    public static void main(String[] args){
        List list = new ArrayList();
        list.add(1);
        int a = (Integer)list.get(0);
    }
}


import java.util.*;

public class Test2{

    public static void main(String[] args){
        List<Integer> list = new ArrayList<Integer>();
        list.add(1);
        int a = list.get(0);
    }
}

反编译如上两段代码,结果是无区别的


注:要在泛型使用多态,可以使用通配符,带通配符的集合可以接收任何类型的集合,那如果只想传入指定类的集合或指定类的子类集合呢?

import java.util.*;

class Shape{}
class Circle extends Shape{}
class Rectangle extends Shape {}

public class Generics2 {

    //通配符?可以传入任何泛型
    static void printCollection(Collection<?> c){
        for(Object e : c){
            System.out.println(e);
        }
    }
    
    //想传入指定类的集合或指定类的子类集合
    static void drawAll(List<? extends Shape> shapes) {
    }
    
    public static void main(String[] args){
        
        Collection<String> li = new ArrayList();
        li.add("1");
        li.add("2");
        li.add("3");
        Collection<Integer> c = new ArrayList();
        c.add(1);
        c.add(2);
        c.add(3);
        Generics2.printCollection(li);
        Generics2.printCollection(c);
    }
}

0 0
原创粉丝点击