我正在阅读 ThinkingInJava 中有关泛型的内容,并发现了此代码片段
public class Erased<T> {
private final int SIZE = 100;
public void f(Object arg) {
if(arg instanceof T) {} // Error
T var = new T(); // Error
T[] array = new T[SIZE]; // Error
T[] array = (T)new Object[SIZE]; // Unchecked warning
}
}
我理解删除的概念,并且我知道在运行时,T 没有类型,它实际上被认为是一个对象(或任何上限)
但是,为什么这段代码可以工作
public class ClassTypeCapture<T> {
Class<T> kind;
public ClassTypeCapture(Class<T> kind) {
this.kind = kind;
}
public boolean f(Object arg) {
return kind.isInstance(arg);
}
}
我们是否应该在这里应用相同的论点,因为由于删除,我们在运行时不知道 T 的类型,因此我们不能编写这样的东西?或者我在这里遗漏了什么?
最佳答案
在您的示例中,T
确实被删除了。但是当您传递给定类型的类对象kind
时,它可以完美地用于上述检查。
看看使用此类时会发生什么:
ClassTypeCapture<String> capture = new ClassTypeCapture<>(String.class);
这里,String
的类对象被传递给给定的构造函数,该构造函数从中创建一个新对象。
在类删除期间,T
是 String
的信息会丢失,但您仍然拥有
ClassTypeCapture capture = new ClassTypeCapture(String.class);
因此这个String.class
被保留并为对象所知。
关于java - 为什么不允许使用instanceof,但在泛型中允许使用Class.isInstance()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59970675/