java泛型

  • 支持泛型类以及泛型方法
class MyGen<T,E>{
    //<X>类型声明在返回值前,若未在类中声明,则必须在方法里声明
    public static <X> X myCast(Object o){
        return (X)o;
    }
}
//类型推导,由前面的引用进行
String s = MyGen.myCast("lalala");
//显式调用
String s = MyGen.<String>myCast("lalal");

  • 泛型使用类型擦除,对于子类继承使用桥方法
public class T{
        public static void main(String[] args){
                F<String> f = new S();
                System.out.println(f.getE("xxx"));
        }

}

class F<E>{
        //该方法将被擦除成public Object getE(Object e){...}
        public E getE(E e){
                return null;
        }
}
class S extends F<String>{
        //实际的方法重写代码,系统将为S生成一个public Object getE(Object e){...}的桥方法,并将实际调用代理到以下的方法
        public String getE(String s){
                return "love";
        }
}


//以下为桥接代码

  • 通配符,一般只用于方法参数中,进行更大范围的参数传入
? extends E,表示E的所有子类中的某一个具体子类.
? super E,表示E的所有父类中的某一个具体父类.
? 等价于(? extends Object) 表示所有类中的某一个具体类.(只用于<?>替代<Object>使用Object方法以及Class<?>与具体类型无关方法)

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

/**
 * @author doggy
 *         Created on 16-5-27.
 */
public class Test {
    public static void main(String[] args) {
        List<? extends String> l = new ArrayList<String>();
        addFrom(l);
        List<Object> ll = new ArrayList<Object>();
        addTo(new ArrayList<Object>());
    }
    //不能从super泛型中获得数据(因为不确定是哪个父类),只能使用Object进行for循环。
    public static void addTo(List<? super String> es){
        es.add("sdfsf");
    }
    //不能往extends泛型中添加数据,因为某个具体子类中加入其他子类可能错误。
    public static void addFrom(List<? extends String> es){
        for(String x:es){
            System.out.println(es);
        }
    }
}


posted @ 2016-05-27 17:40  fcat  阅读(138)  评论(0编辑  收藏  举报