对泛型来说,任何在运行时候需要知道确切类型信息的操作都将无法工作。
public class Erasde <T>{
private static final int SIZE=100;
public static void f(Object ob){
if (ob instanceof T){}//erroe
T var=new T();//erroe
T[] arra=new T[SIZE];//erroe
T[]arrar=(T)new Object[SIZE];//erroe
}
}
因为T是泛型,所以以上代码只要是需要使用T的确切类型信息时候都会报错。 <br /> 我们可以通过引入类型标签来对擦除进行补偿,同时需要我们显示的去传递你的类型的Class对象。<br /> 在上面的实例中我们不能使用instanceof,但但我们引入类型标签后就可以去使用动态的isInsrance();put
package com.package15;
class Building{}
class House extends Building{}
public class ClassTypeCapture <T>{
Class<T> kind;
ClassTypeCapture(Class<T> kind){
this.kind=kind;
}
public boolean f(Object arg){
return kind.isInstance(arg);
}
public static void main(String[] args) {
ClassTypeCapture<Building> capture = new ClassTypeCapture<>(Building.class);
System.out.println(capture.f(new Building()));
System.out.println(capture.f(new House()));
}
}
~Output
true
true
我们在上述列子中无法对泛型类型创建实例,但是我们可以通过工厂对象的方法,通过泛型的Class对象中的newInstance()来创建新的对象,但要注意添加默认构造器。
package com.package15;
class ClassAFactory<T>{
T x;
public ClassAFactory(Class<T> kind){
try {
x = kind.newInstance();
} catch (Exception e) {
System.out.println("创建对象失败");
}
}
}
class Employee{}
public class InserantiateGeenericType {
public static void main(String[] args) {
ClassAFactory<Employee> aFactory = new ClassAFactory<>(Employee.class);
System.out.println(aFactory.x);
try {
ClassAFactory<Integer> integerClassAFactory = new ClassAFactory<>(Integer.class);
}catch (Exception e){
System.out.println("创建Integer实例失败");//因为Integer中没有默认构造器
}
}
}
泛型数组:
1.在想创建泛型数组的时候,创建一个使用ArrayList(ArrayList内部使用的是数组)
2.创建一个被擦除类型的数组,然后对其转型.
package com.package15;
class Generic<T>{
}
public class ArrayOfGeneric {
static final int SIZE=100;
static Generic<Integer> []gia;
public static void main(String[] args) {
gia=(Generic<Integer>[])new Generic[SIZE];
System.out.println(gia.getClass().getSimpleName());
gia[0]=new Generic<Integer>();
System.out.println(gia[0]);
}
}