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);
}
}
}