在Java中,我可以在instanceof表达式中使用基本类型文字或类型变量吗?

我可以在instanceof表达式中使用基本类型文字或类型变量吗?

 class MyClass { { boolean b1 = null instanceof T; // T erasure -> Object should be used boolean b2 = 2 instanceof Integer; // Incompatible operands } 

我收到了编译错误。 有没有办法绕过这些错误并在instanceof表达式中使用原始类型的文字/类型变量?

基本上,我想要放心,不,我永远无法做到这一点。

不,因为类型擦除MyClass一个实例实际上并不知道T是什么。

您需要一个Class的实例。 然后你可以使用isInstance方法。 一种方法是在构造函数中指定它:

 class MyClass { private Class clazz; MyClass(Class clazz) { this.clazz = clazz; } // Now you can use clazz to check for instances, create new instances ect. } 

对于第二个问题,问题是第一个操作数,而不是第二个操作数。 原始值本身不是Integer的实例; 盒装版本是:

 Object obj = 2; boolean b2 = obj instanceof Integer; 

只要你有一个真正的原始值,你就已经知道了这种类型,所以进行动态类型检查没有多大意义。

  1. 由于类型擦除,你不知道T是什么。

  2. 文字(字符串文字除外)不是对象。
    因此,没有。

基本上,instanceof将对象​​作为左操作数。 原始变量不是对象,所以不,你不能那样使用它。

  1. 你不能这样做。
  2. 即使你可以,也不能使用它。

instanceof的典型用法看起来像

 void somemethod(Collection c) { if (c instanceof List) {...} } somemethod(new ArrayList()); 

这里重要的是你得到一个超类型的对象(这里是:Collection),它可能是也可能不是子类型的实例(这里是:List)。 使用原语这是不可能的:

 void anothermethod(double x) { .... // <------ X } anothermethod(42); 

在X点,有一个double类型的变量x,没有关于某个int 42的隐藏信息。实际参数42没有伪装成double,它被转换为double。 这就是为什么instanceof对于原语没有意义。