首页 > 代码库 > 泛型方法与类型推断

泛型方法与类型推断

一。好处

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.Integerjava.lang.FloatGenericMethods

 

三。泛型与反射

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.Arrayspublic 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";    }}