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

标签 java generics

我正在阅读 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/

相关文章:

java - JAXB 整数和长解析

java - Mockito 不识别类

java - Android 数据绑定(bind)单选组

java - 有没有办法在父类(super class)中定义泛型方法来引用继承类的类型?

Java异常crshes玩法框架

java - 如何从iso获取国家电话前缀

java调用通用静态方法

java - 为什么我不能创建字符串和通用对象的映射

Java 泛型推断类型

java - java泛型和继承相关的编译错误