Java 整数的整数实例
为什么Java执行自动装箱时会出现编译时错误?我错过什么了吗Java 整数的整数实例,java,instanceof,autoboxing,Java,Instanceof,Autoboxing,为什么Java执行自动装箱时会出现编译时错误?我错过什么了吗 int primitiveIntVariable = 0; if (primitiveIntVariable instanceof Integer) { } 我明白了 顾名思义,instanceof表示类的实例(对象)。基本数据类型不是实例 以下是获取基本数据类型的类的方式: int i = 1; System.out.println(((Object)i).getClass().getName()); // prints: j
int primitiveIntVariable = 0;
if (primitiveIntVariable instanceof Integer) {
}
我明白了
顾名思义,instanceof表示类的实例(对象)。基本数据类型不是实例 以下是获取基本数据类型的类的方式:
int i = 1;
System.out.println(((Object)i).getClass().getName());
// prints: java.lang.Integer
因此,不要使用instanceof,而是像这样使用isInstance(…):
Integer.class.isInstance(1); // returns true
Integer.class.isInstance(1.2); // returns false
希望这有帮助。祝你好运。
int
只能是一个int
,因此使用实例的整个概念毫无意义,而且被误导了
只有在需要检查实际对象是否是与所讨论的变量类型(或已知的超类型)不同的特定类型时,才可以使用instanceof
例如,如果变量的声明类型(或返回值,或表达式的编译类型)是Integer
,那么检查它是否是Integer
的实例是毫无意义的。鉴于Java是类型安全的,您已经知道它是类型安全的
类似地,检查已知的整数
是否是数
的实例也毫无意义。你已经知道了
检查已知的int
是否是整数的实例就更没有意义了。它是一个原语,你知道它是,所以它绝对不可能是任何对象类型的实例
最后一个将生成一个编译器错误。前两个例子是编译器警告,如果使用任何好的IDE,这一点非常明显。始终使用一个好的IDE,因为它们捕捉到了我们偶尔都会写的许多愚蠢的错误
因此,上面解释了为什么尝试都没有意义,但即使Integer的integerVar instanceof Integer
没有意义,它可以编译,但是intVar instanceof Integer
无法编译,为什么呢
原因实际上与问题中的这一错误陈述有关:
Java何时进行自动装箱
Java不会到处都进行自动装箱。自动装箱仅在以下情况下发生:
- ,例如,
整数x=5
- ,例如,
foo(5)
其中参数是一个整数
- ,例如
(整数)5
或(对象)5
它不是在表达式的中间发生的,< <代码>实例>是一个表达式运算符。
但是,更具体地说,它无法编译,因为JLS这样说:
关系表达式instanceof
ReferenceType
instanceof
运算符的RelationalExpression操作数的类型必须是引用类型或null类型,否则会发生编译时错误
顾名思义,instanceof表示类的实例(对象)。基本数据类型不是实例。仅仅因为java能够自动将int转换为整数,并不意味着int本身就是一个整数。但这就是您在这里测试的内容。“当Java执行自动装箱”您为什么认为Java会在该语句中执行自动装箱?自动装箱仅在和中发生。它不发生在表达式的中间,并且<代码> INSTANCE < /COD>是表达式运算符。请注意,您的解决方案不测试<代码> int <代码>本身,但首先将其自动写入到代码> >整型< /COD>(因为该方法预期对象而不是int),因为执行了<代码>整数>类.ISCULL(1)。
毫无意义,因此这不是一件有用的事情。Java是类型安全的,所以绝对不可能是错误的,那么为什么还要进行测试呢?为什么要将原语(不是对象)转换为对象(使用编译器自动装箱)以检查它是否是某个特定的对象。这不是一个物体,所以支票很可笑。
Integer.class.isInstance(1); // returns true
Integer.class.isInstance(1.2); // returns false