[英]Understand Type Erasure in Java
没有类型擦除的情况下如何实现泛型 ? 据我了解,如果我有class Foo<T>
,则T
基本上被Object
取代,并且编译器仅具有帮助它将其转换为正确的参数化类型的元数据。
但是,如果实现了实现,则T
将是实际的参数化类型(与Object相对)...但是我不明白编译器如何才能确定new T()
是否有效调用(即,则T可能没有no-arg构造函数)。
具体来说,在Java中,构造函数不会被子类继承,因此,只要无法将给定的参数化类型T
缩小为特定类型,就无法运行new T()
,因为Java是静态类型的, 不管是否发生了改造 。 但是,使用new
实例化只是使用类的一种情况 。
对于我来说,不被删除的泛型最明显的用途是能够在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.