有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在原语或原语包装类中使用带有文本的var会产生什么结果?

在阅读并讨论了Java 10s新的保留类型名称之后,var ({a1})讨论中出现了一个问题

将其与文本一起使用时,如:

var number = 42;

number现在是int还是Integer?如果您只是将其与比较运算符一起使用,或者将其用作参数,则由于自动装箱和-取消装箱,这通常并不重要。 但是由于Integer的成员功能,它可能会影响

那么哪种类型是由var、原语int或类Integer创建的呢


共 (4) 个答案

  1. # 1 楼答案

    根据14.4.1中的proposed specification changes局部变量声明器和类型

    If LocalVariableType is var, then let T be the type of the initializer expression when treated as if it did not appear in an assignment context, and were thus a standalone expression (15.2). The type of the local variable is the upward projection of T with respect to all synthetic type variables mentioned by T (4.10.5).

    换句话说,局部变量的推断类型是初始值设定项表达式作为独立表达式使用时的类型42作为一个独立表达式,其类型为int,因此,变量number的类型为int

    向上投影是规范变更中定义的术语,不适用于此类简单情况

  2. # 2 楼答案

    var要求编译器根据初始值设定项的类型推断变量的类型,42的自然类型为int。所以number将是一个int。这就是JLS example says所说的:

    var a = 1;  // a has type 'int' 
    

    如果它以任何其他方式工作,我会感到惊讶,当我写这样的东西时,我肯定希望有一个原始的

    如果需要var作为装箱原语,可以执行以下操作:

    var x = (Integer) 10;  // x is now an Integer
    
  3. # 3 楼答案

    编译器对var number = 42;的处理类似于int number = 42;

    public void method(Integer i) {
        System.out.print("Integer method");
    }
    public void method(int i) {
        System.out.print("int method");
    }
    
    var n = 42; // n has type 'int' 
    method(n); // => "int method"
    

    并在以下情况下自动装箱:

    public void method(Integer i) {
        System.out.print("Integer method");
    }
    
    var n = 42; // a has type 'int'
    method(n); // => "Integer method"
    
  4. # 4 楼答案

    让我们测试一下。使用jshell:

    jshell> Integer boxed1 = 42000;
    boxed1 ==> 42000
    
    jshell> Integer boxed2 = 42000;
    boxed2 ==> 42000
    
    jshell> System.out.println(boxed1 == boxed2);
    false
    
    jshell> var infered1 = 42000;
    infered1 ==> 42000
    
    jshell> var infered2 = 42000;
    infered2 ==> 42000
    
    jshell> System.out.println(infered1 == infered2);
    true
    

    在第一次比较中,两个变量不一样;它们是不同的例子。然而,第二个比较是正确的,因此这里必须推断出一个int

    注意:要在家中试用,请使用外部值<-128, 128). 缓存该范围内的整数实例