摘要:實(shí)際上并未引入太多新特性,不過(guò)有一個(gè)新特性最引人注目等了這么久終于支持類型推斷了,那么今天就來(lái)看一看的類型推斷,和其他語(yǔ)言相比有哪些異同吧。本次更新也支持了類型推斷,對(duì)于這種重量級(jí)語(yǔ)言來(lái)說(shuō)還是一件值得高興的事。
0x01 Java 10簡(jiǎn)介
自從有了校內(nèi)的下載網(wǎng)站,很少上Oracle官網(wǎng)下載JDK了,結(jié)果前兩天聽(tīng)鐘神說(shuō)Java 10都出來(lái)了2333。干IT這行還真是要與時(shí)俱進(jìn)啊,那就來(lái)看一下Java 10吧。
Java 10實(shí)際上并未引入太多新特性,不過(guò)有一個(gè)新特性最引人注目:
JEP 286: Local-Variable Type Inference
等了這么久Java終于支持類型推斷了,那么今天就來(lái)看一看Java 10的類型推斷,和其他語(yǔ)言相比有哪些異同吧。
0x02 類型推斷概述類型推斷是新型的高級(jí)語(yǔ)言提供的一類功能,允許根據(jù)編譯上下文來(lái)推斷變量的類型,不需要自己手動(dòng)寫類型,使得代碼更加簡(jiǎn)潔。
目前我接觸的編程語(yǔ)言中,JavaScript、Swift和Python都支持這種語(yǔ)法。本次Java 10更新也支持了類型推斷,對(duì)于Java這種重量級(jí)語(yǔ)言來(lái)說(shuō)還是一件值得高興的事。
0x03 體驗(yàn)Java 10的類型推斷功能讓我們寫一段Base64編碼的代碼,體驗(yàn)一下Java 10的類型推斷功能:
//Java代碼 import java.util.Base64; class Untitled { public static void main(String[] args) { var b64encoder = Base64.getEncoder(); var encodeString = b64encoder.encodeToString("Hello World".getBytes()); System.out.println(encodeString); } }
初步體驗(yàn)還是不錯(cuò)的,只是我的IDE還沒(méi)有升級(jí),還不支持自動(dòng)提示這種語(yǔ)法。甚至Eclipse還不能正常編譯Java 10的代碼,我只能手動(dòng)通過(guò)javac來(lái)編譯。整體而言Java 10的類型推斷功能是類似于Swift/JavaScript的,需要寫var關(guān)鍵字,并不像是Python那樣的使用方式。
0x04 Java 10類型推斷的不足上面的用法看起來(lái)很友好,那么有沒(méi)有更自由的寫法呢?很快的我就收到了編譯器錯(cuò)誤:
//Java代碼 import java.util.Base64; class Untitled { public static void main(String[] args) { var b64encoder = Base64.getEncoder(); var encodeString = b64encoder.encodeToString("Hello World".getBytes()); System.out.println(encodeString); var a = 1,b = 2; } }
錯(cuò)誤: "var" 不允許在復(fù)合聲明中使用 var a = 1,b = 2; ^ 1 個(gè)錯(cuò)誤
看來(lái)Java 10的類型推斷還是有諸多限制和不便,不像其他語(yǔ)言那般好用,對(duì)比一下Swift語(yǔ)言:
//Swift代碼 import Foundation let string = "Hello World" let data = string.data(using: String.Encoding.utf8)! let encodeString = data.base64EncodedString() print(encodeString) var a = 1, b = 2;
比如說(shuō)Java 10并沒(méi)有let關(guān)鍵字,也就是說(shuō),并不能快速的使用類型推斷定義常量。同時(shí)也不能一次用var定義多個(gè)變量,當(dāng)同類型變量較多的時(shí)候,我覺(jué)得還不如把類型寫出來(lái)。
同時(shí),根據(jù)官方的說(shuō)明,你也不能將var用于成員變量,只能用于局部變量,例如下面的例子會(huì)出現(xiàn)編譯錯(cuò)誤:
//Java代碼 import java.util.Base64; class Untitled { class Student { var name = ""; Student(String name) { this.name = name; } } public static void main(String[] args) { var b64encoder = Base64.getEncoder(); var encodeString = b64encoder.encodeToString("Hello World".getBytes()); System.out.println(encodeString); } }
錯(cuò)誤: 此處不允許使用 "var" var name = ""; ^ 1 個(gè)錯(cuò)誤
而在其他語(yǔ)言中,你可以更自由的使用var,在任何你想要的地方,只要不引起歧義:
//Swift代碼 import Foundation class Student { var name = ""; init(name: String) { self.name = name; } } var string = "Hello World" let data = string.data(using: String.Encoding.utf8)! let encodeString = data.base64EncodedString() print(encodeString)
作為對(duì)比,Swift比Java 10在類型推斷方面更加靈活,同時(shí)二者也有共同點(diǎn)——它們都是強(qiáng)類型語(yǔ)言,任何變量必須具有某種類型,所謂的類型推斷只是一種語(yǔ)法上的精簡(jiǎn)。例如你不能像Python一樣在形參列表中也不使用參數(shù)類型,或者直接省略返回值類型,這些類型還都是必須的:
#Python代碼 def printNumber(num): print(num) return 1 retCode = printNumber(4) print(retCode)
//Swift代碼 func printNumber(num: Int) -> Int { print(num) return 1 } let retCode = printNumber(num: 2) print(retCode)
//Java代碼 import java.util.Base64; class Untitled { public static int printNumber(int num) { System.out.println(num); return 1; } public static void main(String[] args) { var retCode = printNumber(3); System.out.println(retCode); } }0x05 總結(jié)
經(jīng)過(guò)簡(jiǎn)單的體驗(yàn),基本清楚了Java 10的類型推斷功能。以后在局部范圍定義對(duì)象,可以有了更簡(jiǎn)略的寫法:
//Before Java 9 MessageDigest md = MessageDigest.getInstance("SHA-512"); //Java 10 var md = MessageDigest.getInstance("SHA-512");
顯然這種代碼不兼容早期版本的Java,即使你將Java 10的代碼編譯為字節(jié)碼,也不能在低版本的JVM上運(yùn)行。這種新語(yǔ)法也不能用于Android開(kāi)發(fā)等用途。比如我使用OpenJDK 1.8來(lái)測(cè)試我們前面編碼base64的代碼,就出現(xiàn)了異常:
$ java -version java version "10" 2018-03-20 Java(TM) SE Runtime Environment 18.3 (build 10+46) Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10+46, mixed mode) $ java Main SGVsbG8gV29ybGQ=
# java -version openjdk version "1.8.0_111" OpenJDK Runtime Environment (IcedTea 3.2.0) (suse-33.1-x86_64) OpenJDK 64-Bit Server VM (build 25.111-b14, mixed mode) # java Main Error: A JNI error has occurred, please check your installation and try again Exception in thread "main" java.lang.UnsupportedClassVersionError: Main has been compiled by a more recent version of the Java Runtime (class file version 54.0), this version of the Java Runtime only recognizes class file versions up to 52.0 at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:763) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:467) at java.net.URLClassLoader.access$100(URLClassLoader.java:73) at java.net.URLClassLoader$1.run(URLClassLoader.java:368) at java.net.URLClassLoader$1.run(URLClassLoader.java:362) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:361) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:495)
所以說(shuō)這種新語(yǔ)法還是不夠靈活,同時(shí)兼容性也堪憂,但是聊勝于無(wú)。同時(shí)也會(huì)一定程度上減少Java代碼的長(zhǎng)度,讓編程更加優(yōu)雅一些。同學(xué)們?nèi)绻塍w驗(yàn)一下新語(yǔ)法,可以升級(jí)到Java 10,不過(guò)好多Java應(yīng)用都不兼容,所以升級(jí)還是需慎重啊!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/71177.html
摘要:目標(biāo)發(fā)布目前有兩個(gè)主要功能針對(duì)局部變量類型推斷這將刪除大部分對(duì)象實(shí)例化所需的冗長(zhǎng)的包含手動(dòng)類型信息整合源樹(shù)的庫(kù)即不同的庫(kù)將被合并成一個(gè)單一的存儲(chǔ)庫(kù)。特別是,承諾為局部變量實(shí)例化引入類型推斷機(jī)制,并將現(xiàn)有的存儲(chǔ)庫(kù)合并到一個(gè)存儲(chǔ)庫(kù)中。 JDK 10 何時(shí)發(fā)布? JDK 10 是 Java 10 標(biāo)準(zhǔn)版的部分實(shí)現(xiàn),將于 2018 年 3 月 20 日發(fā)布,改進(jìn)的關(guān)鍵點(diǎn)包括一個(gè)本地類型推斷、一...
摘要:的新特性說(shuō)了這么多,看都會(huì)有哪些特性來(lái)改變我們寫代碼的方式呢局部變量類型推斷局部變量類型推斷可以說(shuō)是中最值得注意的特性,這是語(yǔ)言開(kāi)發(fā)人員為了簡(jiǎn)化應(yīng)用程序的編寫而采取的又一步,如下圖所示。 showImg(https://segmentfault.com/img/remote/1460000015356980); Java 9才發(fā)布幾個(gè)月,很多玩意都沒(méi)整明白,現(xiàn)在Java 10又快要來(lái)了...
摘要:就等于局部變量類型推斷使用示例既然叫局部變量類型推斷,以只能用在局部變量中,下面給出更多使用示例。,本次局部變量類型推斷實(shí)戰(zhàn)文章就到這里了,后續(xù)帶來(lái)更多的的實(shí)戰(zhàn)方面的文章。 現(xiàn)在 Java 9 被遺棄了直接升級(jí)到了 Java 10,之前也發(fā)過(guò) Java 10 新特性的文章,現(xiàn)在是開(kāi)始實(shí)戰(zhàn) Java 10 的時(shí)候了。 今天要實(shí)戰(zhàn)的是 Java 10 中最重要的特性:局部變量類型推斷,大家...
摘要:美國(guó)時(shí)間月日,正式發(fā)布了,這是據(jù)以后支持的首個(gè)長(zhǎng)期版本。加強(qiáng)是中的新特性,開(kāi)始對(duì)增加了以下個(gè)新方法。結(jié)束語(yǔ)現(xiàn)在許多人還在使用或者,不過(guò)在年初就會(huì)結(jié)束免費(fèi)更新。 美國(guó)時(shí)間 09 月 25 日,Oralce 正式發(fā)布了 Java 11,這是據(jù) Java 8 以后支持的首個(gè)長(zhǎng)期版本。 為什么說(shuō)是長(zhǎng)期版本,看下面的官方發(fā)布的支持路線圖表。 showImg(https://segmentfaul...
閱讀 2835·2023-04-25 17:59
閱讀 676·2023-04-25 15:05
閱讀 669·2021-11-25 09:43
閱讀 3026·2021-10-12 10:13
閱讀 3532·2021-09-27 13:59
閱讀 3577·2021-09-23 11:21
閱讀 3872·2021-09-08 09:35
閱讀 561·2019-08-29 17:12