package cc.openhome;
public class Util {
public static <T> ArrayList<T> asList(T... a) {
ArrayList<T> arrLt = new ArrayList<>();
for(T t : a) {
arrLt.add(t);
}
return arrLt;
}
}
如上所示,Util中的泛型方法调用形式可以如下:
ArrayList<String> arrayList = Util.<String>asList("123","wer");
ArrayList<String> arrayList = Util.asList("123","wer");
举个java类库中的例子:
public static <T> T[] copyOf(T[] original, int newLength) { return (T[]) copyOf(original, newLength, original.getClass());}
String[] a = {"12", "sd"};String[] newWords = Arrays.copyOf(a, a.length * 2);
如上所示,在调用的过程中可以省略参数,这是由于编译器可以根据参数的引用进行类型的推断。
public class BeanUtil {
public static <T> T getBean(Map<String, Object> data, String clzName)
throws Exception {
Class clz = Class.forName(clzName);
...略
return (T) bean;
}
}
在这个例子中,虽然也能进行上面的两种调用,但类型不能判定为正确的Student类型,返回的是Object对象,就不能进行下面的级联操作
String name = BeanUtil.<Student>getBean(data, "cc.openhome.Student").getName();
对于类中的静态域,不能申明为泛型,泛型类的静态上下文中类型变量无效
首先,在JVM加载Class的时候会将类中所有的常量,静态常量,静态方法写到内存的方法区内;
其次,所有的常量,静态常量和静态方法在方法区内有且只有一份,并为所属类所创建的所有对象共享;
那么用你的方式解释,问题来了,如果静态常量和静态方法中使用了类的类型变量,当程序猿使用不同的类型参数实例化对象时会导致编译器插入强制类型转换代码错误(1.5版泛型指南上有实例解释);
例如,存在一个C泛型类,其静态方法中使用了类的类型变量,先后定义了A对象,B对象,那么如果A对象先把类的类型变量初始化为String,而B对象后把类的类型变量初始化为Integer。此时,静态方法中类的类型变量为Integer类型,而A对象又调用了这个静态方法。会出现你说的错误~ 类似于数据库中的读脏数据~至于为什么静态方法可以使用自己的泛型,而不能用类的泛型类型就不知道了,可能是一种硬性规定吧