在泛型中的所有动作都发生在边界处-对传递进来的值进行额外的编译期检查,并插入对传递出去的值的转型。擦除导致任何在运行时需要知道确切类型信息的操作无法工作。
import java.util.HashMap;
import java.util.Map;
class Building {
}
class House extends Building {
}
public class ClassTypeCapture<T> {
Map<String, Class<?>> map = new HashMap<String, Class<?>>();
public void addType(String typename, Class<?> kind) {
Class<?> cls = typename.getClass();
map.put(typename, kind);
}
public Object createNew(String typename) {
try {
return map.get(typename).newInstance();
} catch (Exception e) {
System.out.println(e);
return Person.NULL;
}
}
Class<T> kind;
public ClassTypeCapture(Class<T> kind) {
this.kind = kind;
}
public boolean f(Object arg) {
return kind.isInstance(arg);
}
public static void main(String[] args) {
ClassTypeCapture<Building> ctt1 =
new ClassTypeCapture<Building>(Building.class);
// System.out.println(ctt1.f(new Building()));
// System.out.println(ctt1.f(new House()));
// ClassTypeCapture<House> ctt2 =
// new ClassTypeCapture<House>(House.class);
// System.out.println(ctt2.f(new Building()));
// System.out.println(ctt2.f(new House()));
ctt1.addType(String.class.getName(),String.class);
Object o = ctt1.createNew(String.class.getName());
System.out.println(o);
}
} /* Output: