一。好处
1.代替整个类泛型化
2.static方法无法访问泛型类的类型参数,所以static方法需要使用泛型能力,就必须使其成为泛型方法。
二。示例
只需将泛型参数列表置于返回值之前。
public class GenericMethods { public void f(T x) { System.out.println(x.getClass().getName()); } public static void main(String[] args) { GenericMethods gm = new GenericMethods(); gm.f(""); gm.f(1); gm.f(1.0F); gm.f(gm); } }
结果:好像f()方法被无限重载过一样。
java.lang.String
java.lang.Integer
java.lang.Float
GenericMethods
三。泛型与反射
public <T> T getInstance(Class<T> clazz) throws InstantiationException, IllegalAccessException{ return clazz.newInstance(); }
调用示例
getInstance(Class.forName("com.gl.User"));
forName
public static Class<?> forName(String className) throws ClassNotFoundException
四。API示例
java.util.Arrays public static <T> List<T> asList(T... a)
1.用法
1 // List<Shape> shapes = Arrays.asList(new Rect(),new Square());//编译期出错。 数组与泛型容器的区别:数组有协变类型,而泛型容器没有内建协变类型 2 List<Rect> rects = Arrays.asList(new Rect(),new Square()); 3 List<Shape> rects1 = Arrays.<Shape>asList(new Rect(),new Square()); //显示类型参数说明 4 5 List<Rect> rects2 = new ArrayList<Rect>(); 6 Collections.addAll(rects2, new Rect(),new Square());
类继承
class Shape{ void draw(){ System.out.println(this+".draw()"); } } class Circle extends Shape{ @Override public String toString() { return "Circle"; } } class Rect extends Shape{ @Override public String toString() { return "Rect"; } } class Triangle extends Shape{ @Override public String toString() { return "Triangle"; } } class Square extends Rect{ @Override public String toString() { return "Square"; } }