我可以在instanceof
表达式中使用原始类型文字或类型变量吗?
class MyClass<T> {
{
boolean b1 = null instanceof T; // T erasure -> Object should be used
boolean b2 = 2 instanceof Integer; // Incompatible operands
}
我收到了编译错误。有没有办法绕过这些错误并在instanceof
表达式中使用原始类型的文字/类型变量?
基本上,我想要放心,不,我永远无法做到这一点。
答案 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)
由于类型删除,您无法知道T
是什么。
文字(字符串文字除外)不是对象 因此,没有。
答案 2 :(得分:1)
基本上,instanceof将对象作为左操作数。原始变量不是对象,所以不,你不能那样使用它。
答案 3 :(得分:0)
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对原语毫无意义。