gpt4 book ai didi

java - 为什么不允许使用instanceof,但在泛型中允许使用Class.isInstance()?

转载 作者:行者123 更新时间:2023-12-02 01:43:30 24 4
gpt4 key购买 nike

我正在阅读 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 的类对象被传递给给定的构造函数,该构造函数从中创建一个新对象。

在类删除期间,TString 的信息会丢失,但您仍然拥有

ClassTypeCapture capture = new ClassTypeCapture(String.class);

因此这个String.class被保留并为对象所知。

关于java - 为什么不允许使用instanceof,但在泛型中允许使用Class.isInstance()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59970675/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com