对泛型来说,任何在运行时候需要知道确切类型信息的操作都将无法工作。
public class Erasde <T>{private static final int SIZE=100;public static void f(Object ob){if (ob instanceof T){}//erroeT var=new T();//erroeT[] arra=new T[SIZE];//erroeT[]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()));}}~Outputtruetrue
我们在上述列子中无法对泛型类型创建实例,但是我们可以通过工厂对象的方法,通过泛型的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]);}}
