了解Java中的类型清除

时间:2019-05-23 20:55:34

标签: java type-erasure

如何在不删除类型的情况下实现泛型 ?据我了解,如果我有class Foo<T>T基本上会替换为Object,并且编译器只有元数据可以帮助将其转换为正确的参数化类型。

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

1 个答案:

答案 0 :(得分:2)

特别是在Java中,构造函数不会被子类继承,因此,只要无法将给定的参数化类型T缩小为特定类型,就无法运行{{1} },因为Java是静态类型的,所以无论是否进行版本化。但是,使用new T()进行实例化仅使用类的一种情况

Instanceof

对我来说,最常见的未被擦除的用法是能够在new表达式中使用T

instanceof

还有一种想法是查看class Box<T> { public boolean isInst(Object obj) { return obj instanceof T; } } 是其他类的超类还是子类,或者检查与类的相等性。

静态方法

通过验证,Java可以“正确”调用T上的static方法。假设我们有以下课程:

T

在定义了这些代码之后,接着是以下代码...

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