如何在不删除类型的情况下实现泛型 ?据我了解,如果我有class Foo<T>
,T
基本上会替换为Object
,并且编译器只有元数据可以帮助将其转换为正确的参数化类型。
但是,如果实现了修订,则T
将是实际的参数化类型(与Object相对)...但是我不明白编译器将如何确定{{ 1}}是有效的调用(即T可能没有no-arg构造函数)。
答案 0 :(得分:2)
特别是在Java中,构造函数不会被子类继承,因此,只要无法将给定的参数化类型T
缩小为特定类型,就无法运行{{1} },因为Java是静态类型的,所以无论是否进行版本化。但是,使用new T()
进行实例化仅使用类的一种情况。
对我来说,最常见的未被擦除的用法是能够在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