在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;
只要你有一个真正的原始值,你就已经知道了这种类型,所以进行动态类型检查没有多大意义。
-
由于类型擦除,你不知道
T
是什么。 -
文字(字符串文字除外)不是对象。
因此,没有。
基本上,instanceof将对象作为左操作数。 原始变量不是对象,所以不,你不能那样使用它。
- 你不能这样做。
- 即使你可以,也不能使用它。
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对于原语没有意义。
- 这种“instanceof”运算符的使用是否被认为是错误的设计?
- “instanceof List”和“o instanceof List ”之间的区别
- 当用于2个不兼容的类时,为什么`instanceof`错误而不是返回`false`?
- 经常使用instanceof是一种好习惯吗?
- java优化nitpick:在投射之前调用instanceof进行检查是否更快投出一些东西并让它抛出exception?
- 通过Collections.unmodifiable *已经用Collections.unmodifiable *包装的实例是多么低效?
- 如何在现代JVM实现中实现instanceof?
- 如何使用编译时genericsvalidation替换运行时instanceof检查
- Java:未选中从X转换为Y /如何实现castOrNull