代码之家  ›  专栏  ›  技术社区  ›  Vishrant

不可转换类型;不能将“int”强制转换为“to”java.lang.Integer文件'

  •  0
  • Vishrant  · 技术社区  · 6 年前

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

    int primitiveIntVariable = 0;
    
    if (primitiveIntVariable instanceof Integer) {
    
    }
    

    我明白了

    Inconvertible types; cannot cast 'int' to 'java.lang.Integer'
    
    2 回复  |  直到 6 年前
        1
  •  6
  •   Andreas dfa    4 年前

    int 只能是一个 ,所以使用 instanceof 毫无意义,而且被误导了。

    你只使用 运算符 如果您需要检查实际对象是否是与所讨论的变量类型(或已知的超类型)不同的特定类型。

    Integer ,那么检查它是否为 运算符 属于 . 鉴于Java是类型安全的,您已经 知道

    同样,检查一个已知的 属于 Number . 你已经知道了 知道 是的。

    检查一个已知的 是一个 运算符 整数 . 它是一个 ,您知道它是,所以它绝对不可能是任何对象类型的实例。

    最后一个将生成一个编译器错误。前两个例子是编译器警告,如果您使用任何好的IDE,这一点非常明显。总是使用一个好的IDE,因为它们会捕捉到很多我们偶尔都会犯的愚蠢的错误。


    integerVar instanceof Integer 没有意义,它编译的很好,但是 intVar instanceof Integer 无法编译,为什么会这样?

    究其原因,其实与问题中的这一错误表述有关:

    当Java执行自动装箱时

    它不会在世界上单独发生 运算符 是表达式运算符。

    15.20.2. Type Comparison Operator instanceof 他这样说:

    关系表达

    的类型 的操作数 运算符 操作人员 必须是引用类型

        2
  •  3
  •   Harshal Parekh Cath    6 年前

    以下是如何获取基元数据类型的类:

    int i = 1;
    System.out.println(((Object)i).getClass().getName());
    // prints: java.lang.Integer
    

    因此,使用isInstance(…)代替instanceof,如下所示:

    Integer.class.isInstance(1); // returns true
    Integer.class.isInstance(1.2); // returns false