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

为什么Java执行自动装箱时会出现编译时错误?我错过什么了吗

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