对泛型来说,任何在运行时候需要知道确切类型信息的操作都将无法工作。

    1. public class Erasde <T>{
    2. private static final int SIZE=100;
    3. public static void f(Object ob){
    4. if (ob instanceof T){}//erroe
    5. T var=new T();//erroe
    6. T[] arra=new T[SIZE];//erroe
    7. T[]arrar=(T)new Object[SIZE];//erroe
    8. }
    9. }
    1. 因为T是泛型,所以以上代码只要是需要使用T的确切类型信息时候都会报错。 <br /> 我们可以通过引入类型标签来对擦除进行补偿,同时需要我们显示的去传递你的类型的Class对象。<br /> 在上面的实例中我们不能使用instanceof,但但我们引入类型标签后就可以去使用动态的isInsrance();put
    1. package com.package15;
    2. class Building{}
    3. class House extends Building{}
    4. public class ClassTypeCapture <T>{
    5. Class<T> kind;
    6. ClassTypeCapture(Class<T> kind){
    7. this.kind=kind;
    8. }
    9. public boolean f(Object arg){
    10. return kind.isInstance(arg);
    11. }
    12. public static void main(String[] args) {
    13. ClassTypeCapture<Building> capture = new ClassTypeCapture<>(Building.class);
    14. System.out.println(capture.f(new Building()));
    15. System.out.println(capture.f(new House()));
    16. }
    17. }
    18. ~Output
    19. true
    20. true

    我们在上述列子中无法对泛型类型创建实例,但是我们可以通过工厂对象的方法,通过泛型的Class对象中的newInstance()来创建新的对象,但要注意添加默认构造器。

    1. package com.package15;
    2. class ClassAFactory<T>{
    3. T x;
    4. public ClassAFactory(Class<T> kind){
    5. try {
    6. x = kind.newInstance();
    7. } catch (Exception e) {
    8. System.out.println("创建对象失败");
    9. }
    10. }
    11. }
    12. class Employee{}
    13. public class InserantiateGeenericType {
    14. public static void main(String[] args) {
    15. ClassAFactory<Employee> aFactory = new ClassAFactory<>(Employee.class);
    16. System.out.println(aFactory.x);
    17. try {
    18. ClassAFactory<Integer> integerClassAFactory = new ClassAFactory<>(Integer.class);
    19. }catch (Exception e){
    20. System.out.println("创建Integer实例失败");//因为Integer中没有默认构造器
    21. }
    22. }
    23. }

    泛型数组:
    1.在想创建泛型数组的时候,创建一个使用ArrayList(ArrayList内部使用的是数组)
    2.创建一个被擦除类型的数组,然后对其转型.

    1. package com.package15;
    2. class Generic<T>{
    3. }
    4. public class ArrayOfGeneric {
    5. static final int SIZE=100;
    6. static Generic<Integer> []gia;
    7. public static void main(String[] args) {
    8. gia=(Generic<Integer>[])new Generic[SIZE];
    9. System.out.println(gia.getClass().getSimpleName());
    10. gia[0]=new Generic<Integer>();
    11. System.out.println(gia[0]);
    12. }
    13. }