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

时间:2011-01-31 18:26:07

标签: java instanceof

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

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

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

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

4 个答案:

答案 0 :(得分:5)

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

您需要拥有Class<T>的实例。然后,您可以使用isInstance方法。一种方法是在构造函数中指定它:

class MyClass<T>
{
    private Class<T> clazz;

    MyClass(Class<T> 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 :(得分:2)

  1. 由于类型删除,您无法知道T是什么。

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

  1. 你不能这样做。
  2. 即使你可以,也不能使用它。
  3. 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对原语毫无意义。