P353
Class引用是指向某个类型的Class对象, 在具体使用中, 为了避免无意中的错误类型替换, 可以使用模板来进一步约束Class的使用.
package com.cnsuning.src;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ListFill<MyInteger> lFill = new ListFill<MyInteger>(MyInteger.class);
System.out.println(lFill.fillList(10));
}
}
class ListFill<T> {
private Class<T> type;
public ListFill(Class<T> type) {
this.type = type;
}
public ArrayList<T> fillList(int size) {
ArrayList<T> list = new ArrayList<T>();
try {
for (int i = 0; i < size; i++) {
list.add(type.newInstance());
}
} catch (InstantiationException | IllegalAccessException e) {
// TODO Auto-generated catch block
throw new RuntimeException(e);
}
return list;
}
}
class MyInteger{
private static int count=0;
private int id = ++count;
public String toString(){
return Integer.toString(id);
}
}
输出
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
对不想限定类型的Class声明可以使用Class<?>的形式说明在这里你要用一个比较宽泛的Class引用.
PS: 值得注意的是, Class对象的newInstance()方法调用的前提是该类型的类有一个默认构造函数(无参构造函数)
除了上边展示的, Class用模板限定类型时还可以指定继承关系, 如<? extends father>或<? super child>, 具体见下边代码
package com.cnsuning.src;
public class Main {
public static void main(String[] args) {
//子类模板用法
Class<? extends A> aChild = B.class;
aChild = C.class; // 子类
aChild = D.class; // 子类的子类
aChild = A.class; // 自身
// 这里显示模板提供的编译时类型检查
// !aChild = E.class;
//父类模板用法
Class<? super B> bSuper = A.class;
Class<B> bClass = B.class;
bSuper = bClass.getSuperclass();
//虽然JAVA中无多继承, 在这里可以确定B的父类就是A,但依然不能这样明确指定模板类型
// Class<A> aClass = bClass.getSuperclass();
}
}
class A {
}
class B extends A {
}
class C extends A {
}
class D extends B {
}
class E {
}