Vis*_*ant 3 java autoboxing instanceof
当 Java 执行自动装箱时,为什么这是编译时错误?我错过了什么吗?
int primitiveIntVariable = 0;
if (primitiveIntVariable instanceof Integer) {
}
Run Code Online (Sandbox Code Playgroud)
我得到
Inconvertible types; cannot cast 'int' to 'java.lang.Integer'
Run Code Online (Sandbox Code Playgroud)
Har*_*ekh 10
顾名思义,instanceof 的意思是类的实例(对象)。原始数据类型不是实例。
这是获取原始数据类型的类的方法:
int i = 1;
System.out.println(((Object)i).getClass().getName());
// prints: java.lang.Integer
Run Code Online (Sandbox Code Playgroud)
因此,不要使用instanceof,而是使用isInstance(...),如下所示:
Integer.class.isInstance(1); // returns true
Integer.class.isInstance(1.2); // returns false
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助。祝你好运。
int不能是 an int,所以整个使用的概念instanceof是没有意义的,并且被误导了。
仅instanceof当您需要检查实际对象是否是与所讨论的变量的类型(或已知的超类型)不同的特定类型时才使用。
例如,如果变量(或返回值,或编译型表达的)的声明的类型,是Integer,则它是没有任何意义,以检查它是一个instanceof的Integer。鉴于 Java 是类型安全的,您已经知道它是。
同样,检查一个 knownInteger是否是instanceofof也没有任何意义Number。你已经知道了。
检查一个 knownint是否是instanceofof 的意义就更小了Integer。它是一个原语,你知道它是,所以它绝对不可能是任何对象类型的实例。
最后会产生编译器错误。前两个示例是编译器警告,如果您使用任何好的 IDE,这将非常明显。总是使用一个好的 IDE,因为它们会捕捉到很多我们偶尔会写的愚蠢的错误。
所以上面解释了为什么即使尝试也没有意义,但即使integerVar instanceof Integer没有意义,它也可以编译,但intVar instanceof Integer编译失败,为什么会这样呢?
原因其实与问题中的这个错误陈述有关:
当 Java 进行自动装箱时
Java 不会在任何地方进行自动装箱。自动装箱只发生在:
它不会在表达式中间单独发生,它instanceof是一个表达式运算符。
但是,更具体地说,它无法编译,因为 JLS 15.20.2。类型比较运算符instanceof是这样说的:
关系表达式
instanceof参考类型运算符的RelationalExpression操作数的类型必须是引用类型或空类型,否则会出现编译时错误。
instanceof
| 归档时间: |
|
| 查看次数: |
10898 次 |
| 最近记录: |