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

Joh*_*oth 2 java instanceof

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

class MyClass<T> {
    {
         boolean b1 = null instanceof T; // T erasure -> Object should be used
         boolean b2 = 2 instanceof Integer; // Incompatible operands
    }
Run Code Online (Sandbox Code Playgroud)

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

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

Jon*_*eet 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.
}
Run Code Online (Sandbox Code Playgroud)

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

Object obj = 2;
boolean b2 = obj instanceof Integer;
Run Code Online (Sandbox Code Playgroud)

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