shew5689
V2EX  ›  Java

真是天道好轮回, Java 新特性:用 var 关键字,数据类型可以扔掉了?

  •  
  •   shew5689 · Sep 30, 2020 · 9743 views
    This topic created in 2232 days ago, the information mentioned may be changed or developed.

    //JDK 10 中新增了 var 局部变量推断的功能:

    //场景一:定义字符串 //旧写法:

    String str = "Hello, Java.";

    //新写法:

    var s = "Hello, Java.";

    //PS:这里的旧写法指的是 JDK 10 之前的版本,而新写法指的是 JDK 10 以后(包含 JDK 10 )的版本。

    //场景二:数值相加 //旧写法:

    int num1 = 111; double num2 = 555.666d; double num3 = num1 + num2; System.out.println(num3);

    //PS:当遇到不同类型相加时( int+ double )会发生数据类型向上转型,因此 num3 就会升级为 double 类型。

    //新写法:

    var n1 = 111L; var n2 = 555.666; var n3 = n1 + n2; System.out.println(n3);

    //场景三:集合 //旧写法:

    List<Object> list = new ArrayList<>(); list.add("Hello"); list.add("Java");

    //新写法:

    var list = new ArrayList<>(); list.add("Hello"); list.add("Java"); //......

    //JavaScript:我慢慢靠近你,你慢慢靠近我,你中有我,我中有你,我特么谢谢你~

    90 replies  •  2020-10-15 20:12:19 +08:00
    larisboy
    larisboy
    Sep 30, 2020
    1
    还不如原来来的方便,出 BUG 都难找
    wupher
    wupher
    Sep 30, 2020
    2
    类型推断,语言本身还是强类型的。

    虽然 JDK10 目前用的比较少,但是 18 年后主力代码已使用 Kotlin 编写:一样可以不显示声明类型,使用推断。从我个人开发经验来讲还好,并不会出 BUG 难找。
    titivillage
    titivillage
    Sep 30, 2020
    3
    我选择 java,图的就是清晰的数据类型
    neptuno
    neptuno
    Sep 30, 2020❤️1
    4
    只是语法糖吧,,底层还是强类型,可以选择不用呀
    mcluyu
    mcluyu
    Sep 30, 2020❤️3
    5
    类型推断跟强弱类型并不冲突, 只是从显示静态类型变为隐式,跟 JavaScript 的弱类型动态类型检查并不一样。
    seakingii
    seakingii
    Sep 30, 2020❤️1
    6
    var 只是语法糖,或许,在查看源代码时不能一目了然的看清楚变量的类型,但对编译器来说,此变量的类型和显示定义是一模一样的。
    EscYezi
    EscYezi
    Sep 30, 2020 via iPhone
    7
    还是感觉不太习惯,经常不能第一时间看出变量的类型。每行长度倒是变短了
    wysnylc
    wysnylc
    Sep 30, 2020
    8
    类型推断≠弱类型
    class 里会变成实际类型
    ipwx
    ipwx
    Sep 30, 2020❤️19
    9
    ... var 在 C#/Scala 里面都多少年了。连 C++ 都好多年前就实装 auto 关键字了。。。

    还有,这哪是什么轮回。JS 的 var 关键字有作用域的傻逼设计,而 Java 的 var 和 C++ 他们一样都只是语法糖,作用域和原来一样,根本不是一个东西好不好。要我说,Java 这波就是借鉴 C#,而不是借鉴 JS 。
    kraits
    kraits
    Sep 30, 2020 via Android
    10
    好像 var 的使用也有很多限制,我还是喜欢写类型声明,虽然懒也不写 var😂
    Reficul
    Reficul
    Sep 30, 2020❤️10
    11
    类型推导,本身语言还是强类型的,所以 IDE 和编译器一样能告诉你每个值的类型。

    每次看到 Java Boy 发言,就忍不住又想地图炮。Java Boy 是不是都在自己的世界里,本能地拒绝先进改变。
    glaucus
    glaucus
    Sep 30, 2020❤️1
    12
    Kotlin 写多了觉得这种挺好的
    allan888
    allan888
    Sep 30, 2020 via Android❤️1
    13
    说真的面对一个巨大的代码库我宁愿用旧的写法, 这样减少我读代码的心智负担。其实大公司一般一个人一星期写不了几行代码,读代码 vs 写代码时间可能超过 10:1.
    lyb11232345688
    lyb11232345688
    Sep 30, 2020
    14
    第一次看到类型推断是在接触 golang 的时候,感觉挺好用的
    TarotVoyager
    TarotVoyager
    Sep 30, 2020❤️9
    15
    dotnet: 北京申奥成功了
    allan888
    allan888
    Sep 30, 2020 via Android
    16
    尤其是 code review 的时候我觉得这些省掉的部分都相当于某种程度的注释。
    还有一个情况是很多滥用的 Stream api 真的是非常难看看懂。。。
    shyling
    shyling
    Sep 30, 2020
    17
    别的语言早就能用的东西还要讨论什么好用不好用。。。这是有多井底之蛙
    pkoukk
    pkoukk
    Sep 30, 2020
    18
    这不就是编译器的类型推断嘛?保守估计 c#至少 5 年前就有了..
    cheng6563
    cheng6563
    Sep 30, 2020
    19
    用 IDEA 一般都是 "new Object()" 然后按 Ctrl+Alt+V,就能前面自动打出" Objec objec = " 了,感觉 var 没啥用。
    echo1937
    echo1937
    Sep 30, 2020
    20
    我看了日历,现在都 JDK15 了,怎么还在发 JDK10 特性的帖子。
    kuro1
    kuro1
    Sep 30, 2020
    21
    golang
    a := "hellp"
    QingXuJiaZhi
    QingXuJiaZhi
    Sep 30, 2020
    22
    @allan888 读代码 /code review 主要看逻辑吧,多数时间不需要管类型啊。而且多数情况下如果类型有错,IDE 会有提示。

    类型推导之所以能流行,就是因为实践中不需要那么 verbose 。
    tabris17
    tabris17
    Sep 30, 2020
    23
    C#早八百年就实现的语法糖

    这只是类型推导,不是可变类型
    tabris17
    tabris17
    Sep 30, 2020
    24
    @pkoukk 我去考证了一下,C#3.0 的特性,2007 年就有了
    majiaxin110
    majiaxin110
    Sep 30, 2020
    25
    人家就是个语法糖
    tctc4869
    tctc4869
    Sep 30, 2020
    26
    你才知道?
    allan888
    allan888
    Sep 30, 2020 via Android
    27
    @cmdOptionKana 因为 review 基本都尽量希望在 github 上看完,实在不确定才 pull 下来看。
    理论上类型问题不大,但是比如你写一个 map 一开始就写好类型我就更好理解这个 map 怎么设计的也大概猜到后面会怎么用,Map 这些类型被玩出花的时候我感觉光靠眼睛看还是有点累。我主要想说如果一件事多花费写的时间,但是省下读的时间的话,长期看对大家都是非常非常值得的。
    lavvrence
    lavvrence
    Sep 30, 2020
    28
    旧特性:类型推导。
    TarotVoyager
    TarotVoyager
    Sep 30, 2020
    29
    Javaer 的没见识真的是笑料
    wysnylc
    wysnylc
    Sep 30, 2020
    30
    @Reficul #11 眼里有偏见的人只会看到偏见
    la2la
    la2la
    Sep 30, 2020
    31
    这个不是 scala 嘛
    superrichman
    superrichman
    Sep 30, 2020 via iPhone
    32
    python:你啥时候把 var 也扔掉?
    MarioLuo
    MarioLuo
    Sep 30, 2020 via Android
    33
    @wupher 学习了 2 天的 kotlin, 问个问题,老项目值不值得切换到 kotlin 了?,kotlin 确实解决了 java 开发中的日常痛点,不过目前看没有太大的吸引力去驱动老项目切换到 kotlin
    quan01994
    quan01994
    Sep 30, 2020
    34
    不,
    java 的 var 在我看来还是有点不舒服,有可能我已经习惯了写类型。
    但是写 C#的时候通篇 var,都不会感到不舒服。。。
    dadachen1997
    dadachen1997
    Sep 30, 2020
    35
    这是“新”特性吗,用了有两年多了。。。。
    tachikomachann
    tachikomachann
    Sep 30, 2020 via Android❤️1
    36
    我觉得以后 idea 估计会跟进,在 var 定义的地方提示类型
    starcraft
    starcraft
    Sep 30, 2020
    37
    显然是 C#那套 var 啊,关 js 什么事。
    chendy
    chendy
    Sep 30, 2020
    38
    悄悄说一句,lombok 有个 var,甚至有 val
    但是还是用不惯,毕竟平时也不需要手打类型,都是 .var 出来的
    goodboy95
    goodboy95
    Sep 30, 2020
    39
    @tachikomachann idea 到 2019.1 了都没更新自动提示 var 类型的功能,vscode java 插件倒是支持了
    sxfscool
    sxfscool
    Sep 30, 2020❤️1
    40
    两个槽点:
    1.java10 就有的特性,很久之前就有了
    2.各位 javaer 的抱残守缺我是没想到的
    shew5689
    shew5689
    OP
    Sep 30, 2020
    41
    我抖了一下机灵,没想到引来了这么多键盘侠~,有些童鞋说借鉴的是 C#, 从发布时间上面看,C# 比 ECMAScript 晚了 5 年~,搞不好 C#也是借鉴的 ECMAScript



    ECMAScript
    发行时间 1997 年
    型態系統 弱类型、動態
    網站 ecma-international.org


    C# 1.0
    2002 年 1 月
    随 Visual Studio 2002 和 .NET Framework 1.0 发布
    InkStone
    InkStone
    Sep 30, 2020
    42
    @shew5689 前面已经有人说过了,js (或者 es )的 var 跟 Java/C#/C++的根本不是一回事。

    你怎么不说它们都是借鉴 VB 的呢? dim a = 3; 不比 ES 早多了么。
    shew5689
    shew5689
    OP
    Sep 30, 2020
    43
    @InkStone ECMAScript 中 var 也是作者设计的语法糖啊~
    yolee599
    yolee599
    Sep 30, 2020❤️1
    44
    习惯了强类型的 C 语言,反而觉得 var 这种类型定义很没踏实感
    chocotan
    chocotan
    Sep 30, 2020
    45
    已经 jdk15 了
    shew5689
    shew5689
    OP
    Sep 30, 2020
    46
    @chocotan 大清的辫子还在你心中。
    shew5689
    shew5689
    OP
    Sep 30, 2020
    47
    上面的部门键盘侠,就算 jdk15 了,jdk10+的新特性你们了解多少?
    gdtdpt
    gdtdpt
    Sep 30, 2020
    48
    写过 switf 、ts 、js 、golang 之后每次写 Java 的时候都会觉得 Java 的变量声明实在是在啰嗦了,明明可以根据表达式推断变量类型非要在变量前面显式加上类型声明,有些类名字还贼长,虽然 idea 能提示,但是遇到命名相似的类一不小心选错了也很糟心。
    neptuno
    neptuno
    Sep 30, 2020
    49
    @cheng6563 new Object().var 也会直接生成
    Oktfolio
    Oktfolio
    Sep 30, 2020
    50
    @shew5689 jdk 11 正式发布就把 9 10 11 新特性完整过了一遍。12 13 14 15 语法上的新特性也都稍微看了看,等 Shenandoah + TLS 直接无脑上新版本。这都 0202 年了,还在说 var ......
    digitO
    digitO
    Sep 30, 2020
    51
    java 转 kotlin 表示真香,java 的代码的确有些繁琐
    across
    across
    Sep 30, 2020
    52
    都转去补习 C++吧,一个类型推导早讨论烂了
    wmwmajie
    wmwmajie
    Sep 30, 2020
    53
    然后 java 就变成 PHP 了呗(手动滑鸡)
    namelosw
    namelosw
    Sep 30, 2020 via iPhone
    54
    这种类似 C#的局部推导跟 TS 之类的全局推导用起来体验差很多. C#经常抽个带匿名类型的方法就要补半天签名.
    woostundy
    woostundy
    Sep 30, 2020❤️1
    55
    @shew5689 #41 感人。C#的 var 和 js 的 var 除了都叫 var 还有啥关系?
    要说用这单词,1971 年的 Pascal 就有 var 了,要说类型推断 1991 年的 Python 更早。怎么扯也扯不到 js 上。
    wupher
    wupher
    Sep 30, 2020❤️1
    56
    @MarioLuo 浅见,仅供参考。

    我是新项目使用 Kotlin,包括后端和 Android 。

    之前后端使用 Groovy,配合 GORM 以及 Spring 。使用 Kotlin 后强类型语言的好处是,编译阶段能解决 80%的问题。强类型语法检查很犀利。坏处也是有的,Kotlin 的强类型甚至体现在容器及模板类。会给 json 的动态转化带来一些问题:接口传输中的 “1”与 1,是完全不同的类型。你的对象类必须严格符合;而在 Groovy 中没有真正的类型,接口中的"1",你想解释成 String, int, Integer, Long 全看你心情。而接口这东西,又不仅仅靠你自己,也要看对方实现人员的实现和心情。

    与 Java 相比 Kotlin 的语法糖更多,且甜。(虽然可能不一定 Groovy 等动态类型那么甜)像修改、扩展类函数,动态生成函数及类,包况 FP,type alias,如果要封装 DDD 框架,也是很方便的。但是总体上,仍然是一种强类型语言。

    目前,Kotlin 在低层能带来其它加分,主要是 Coroutines 。但 ReactiveX 本身也很好用了。

    综上所述,我个人觉得新项目还是挺适合 Kotlin,旧项目如果是 Java 编写还是照旧吧,我目前也是如此。
    haleyao
    haleyao
    Sep 30, 2020
    57
    连我这个对 PL 一无所知的人都知道类型推导,在较“新”的语言里面好像都是标配,比如 dart rust
    咋就还扯上 js,php 呢
    xxboy 我认为涉嫌语言歧视,我更愿意称为培训班 boy
    yazinnnn
    yazinnnn
    Sep 30, 2020
    58
    不行,还不算好用

    A a = str -> { };

    var b = str -> { }; //无法推断类型:lambda 表达式需要显式目标类型
    shew5689
    shew5689
    OP
    Sep 30, 2020
    59
    @haleyao 请问您是哪类 boy?
    shew5689
    shew5689
    OP
    Sep 30, 2020
    60
    @haleyao 优越感这么强~ 谦虚一点不行~
    MarioLuo
    MarioLuo
    Sep 30, 2020 via Android
    61
    @wupher 准备下个新项目试试 kotlin, 空检查很棒,避免了 Java 中的一些防御性代码
    wangwei1025
    wangwei1025
    Sep 30, 2020
    62
    为什么不用 scala
    InkStone
    InkStone
    Sep 30, 2020❤️1
    63
    @shew5689 es 里的 var 不是语法糖,我认为稍微有点编译器知识的人都能看出这一点……

    就像 dim a = 3 里的 dim 也不是语法糖一样。dim a as Integer = 3 能省略成 dim a = 3 才叫语法糖。

    js 里有 var,纯粹是因为这样实现编译器比较简单(对比不需要 var 的 python ),这是一个语法盐,故意让你写着难受的。
    shew5689
    shew5689
    OP
    Sep 30, 2020
    64
    下班咯,祝楼上的老哥们,中秋国庆假期快乐~
    sxfscool
    sxfscool
    Sep 30, 2020❤️1
    65
    楼主舌战群儒,🐂🍺🐂🍺
    IGJacklove
    IGJacklove
    Sep 30, 2020 via Android
    66
    这个不是早就有了? JDK11 就有了吧,我记得都是两三年前的事了
    BoarBoar
    BoarBoar
    Sep 30, 2020
    67
    这是语法糖吧,和 go 差不多,编译时就推断了类型
    比起 python 之类的动态类型根本是两回事
    Shook
    Shook
    Sep 30, 2020
    68
    和 C#的有啥不一样?
    Cbdy
    Cbdy
    Sep 30, 2020
    69
    村网通系列。。
    EminemW
    EminemW
    Sep 30, 2020
    70
    我几年前就看过这个。。
    wolfie
    wolfie
    Sep 30, 2020
    71
    前几层没看到嘲讽楼主的话,反复确认时间。
    Bromine0x23
    Bromine0x23
    Sep 30, 2020❤️1
    72
    es 的 var 变量声明和静态语言的类型推导特性显然不是一回事,像
    ```
    var x = 1;
    x = "1";
    ```
    对类型推导来说不合法的,因为 var 表示的类型不是任意的,而需要根据赋值表达式推导出来的;一旦推导出来,所表示的类型就固定了。

    要翻源头的话,应该是某个函数式语言开始的,像 83 年的 Standard ML 就已经有这个特性了
    simpledwcom
    simpledwcom
    Sep 30, 2020
    73
    没用的鸟功能,我就想要强类型的。。。
    aguesuka
    aguesuka
    Oct 1, 2020 via Android
    74
    新特性 x
    不是贴别旧的特性 o
    aguesuka
    aguesuka
    Oct 1, 2020 via Android
    75
    @tachikomachann 早就有了
    yiyi11
    yiyi11
    Oct 1, 2020 via Android
    76
    new Object().var + tab 键 or enter 键,自动返回值类型补全。智能提示真是太棒啦。你说什么?我一直在用 idea 啊。
    xuanbg
    xuanbg
    Oct 1, 2020
    77
    这个叫类型推断,不是没有数据类型好吧。var a = new String();变量 a 难道就不是 String 类型了?编译器能够从 new String()得到 a 的类型,不需要你特意指定 a 的类型而已。

    idea 有个插件,可以把类型隐藏掉,然后显示为 var……
    JB18CM
    JB18CM
    Oct 1, 2020
    78
    标题党,无聊至极
    littlewing
    littlewing
    Oct 1, 2020
    79
    强类型的语言搞这种东西没什么用,就像 py 一样
    liyhu
    liyhu
    Oct 1, 2020
    80
    感觉是挺没用的,我也不喜欢这个语法糖
    love
    love
    Oct 1, 2020
    81
    @littlewing 类型和强类型完全不是一回事。类型当然重要,你 py 的函数参数和返回个啥类型都不知道,还要看一遍代码实现,非常地不生产力
    ericgui
    ericgui
    Oct 1, 2020
    82
    @seakingii 既然 compiler 层面都一样,不如直接显式声明数据类型,可读性还是很重要的
    keenkiller
    keenkiller
    Oct 1, 2020 via Android
    83
    楼主有点蠢…js 那是语法糖?
    seakingii
    seakingii
    Oct 1, 2020 via Android
    84
    @ericgui 你可以继续用老的显式完整的声明。我个人更喜欢 var 类型推断
    JerryCha
    JerryCha
    Oct 1, 2020
    85
    Microsoft: 因为我们跑的和香港记者一样快,以至于大家看见 Java 的 var 还以为是从 JS 学来的。
    lxilu
    lxilu
    Oct 1, 2020
    86
    @InkStone #42 VB 声明赋初值.Net 才有(非反驳)
    LokiSharp
    LokiSharp
    Oct 1, 2020 via iPhone
    87
    感觉 Java 逐渐变成 C# 的形状了
    ijrou
    ijrou
    Oct 2, 2020
    88
    早就听闻 Java 开始往 C#线路走了,果然没错。。。看来 java 还是。。。
    ipwx
    ipwx
    Oct 2, 2020
    89
    @love 论生产力,Python 3.6+ 的 type annotation 已经很足够了。
    lxk11153
    lxk11153
    Oct 15, 2020
    90
    'var' is not allowed in a compound declaration
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2781 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 150ms · UTC 10:33 · PVG 18:33 · LAX 02:33 · JFK 05:33
    ♥ Do have faith in what you're doing.