繁体   English   中英

了解Java中的类型清除

[英]Understand Type Erasure in Java

没有类型擦除的情况下如何实现泛型 据我了解,如果我有class Foo<T> ,则T基本上被Object取代,并且编译器仅具有帮助它将其转换为正确的参数化类型的元数据。

但是,如果实现了实现,则T将是实际的参数化类型(与Object相对)...但是我不明白编译器如何才能确定new T()是否有效调用(即,则T可能没有no-arg构造函数)。

具体来说,在Java中,构造函数不会被子类继承,因此,只要无法将给定的参数化类型T缩小为特定类型,就无法运行new T() ,因为Java是静态类型的, 不管是否发生了改造 但是,使用new实例化只是使用类的一种情况

INSTANCEOF

对于我来说,不被删除的泛型最明显的用途是能够在instanceof表达式中使用T

class Box<T> {
   public boolean isInst(Object obj) {
      return obj instanceof T;
   }
}

还有一个想法,就是查看T是其他类的超类还是子类,或者检查类的相等性。

静态方法

借助这种技术,Java可以“正确”调用T上的static方法。 假设我们有以下课程:

class Parent {
   void doSomething() { System.out.println("Parent"); }
}

class Child extends Parent {
   void doSomething() { System.out.println("Child"); }
}

定义好这些之后,下面的代码...

class Box<T extends Parent> {

   void test() { T.doSomething(); }

   public static void main(String...args) {
      Box<Parent> parentBox = new Box<>();
      Box<Child> childBox = new Box<>();

      parentBox.test();
      childBox.test();
   }
}

...应打印:

Parent
Child

但改为打印:

Parent
Parent

这是因为T通过擦除变成了Parent

遗产

通用继承(听起来很奇怪)可能(可能)存在:

public class GenericType<T> {
   public class Inner extends T {   }

   public static void main(String...args) {
      GenericType<MyClass>.Inner obj = new GenericType<MyClass>().new Inner();
      System.out.println(obj instanceof MyClass); // Prints true
   }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM