代码之家  ›  专栏  ›  技术社区  ›  sweisgerber.dev

将var与文本一起使用是否会产生一个基元或基元包装器类?

  •  36
  • sweisgerber.dev  · 技术社区  · 7 年前

    在阅读和讨论Java 10s新的保留类型名称之后 var ( JEP 286: Local-Variable Type Inference ),讨论中出现了一个问题。

    将其与以下文字一起使用时:

    var number = 42;
    

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

    那么,哪种类型是由 风险值 ,基本体 内景 或类别 整数 ?

    4 回复  |  直到 7 年前
        1
  •  34
  •   Moti Korets    6 年前

    var 要求编译器根据初始值设定项的类型和 42 int 。所以 number 将是 内景 。这就是 JLS example says :

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

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

    如果你需要 风险值 作为装箱原语,您可以执行以下操作:

    var x = (Integer) 10;  // x is now an Integer
    
        2
  •  12
  •   asgs    6 年前

    根据 proposed specification changes 在14.4.1中 局部变量声明符和类型 :

    如果 LocalVariableType var ,然后让 T 是初始值设定项表达式的类型,就像它没有出现在赋值上下文中一样,因此是一个独立的表达式( 15.2 )。局部变量的类型是 T 关于 T (4.10.5)。

    换句话说,局部变量的推断类型是初始值设定项表达式作为独立表达式使用时的类型。 42 作为独立表达式具有类型 int ,ergo,变量 number 属于类型 内景

    向上投影 是规范变更中定义的一个术语,不适用于这样的简单情况。

        3
  •  7
  •   david a.    7 年前

    让我们测试一下。使用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)。缓存该范围内的整数实例。

        4
  •  1
  •   hoan    6 年前

    编译器处理 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"