3 回答

TA貢獻1942條經驗 獲得超3個贊
造成這種情況的主要原因可能是在較新的 JDK 的編譯器中進行了一些更好的優化。因此,即使目標字節碼級別與舊編譯器相同,目標字節碼本身也可能會得到改進。
根據 Brian Goetz的說法,這很重要:
有時,通過 JVM 改進可以更好地從源代碼轉換為字節碼。比如5之前,
Foo.class
被翻譯成反射調用;之后,去LDC。因此,您可能有理由希望在整個組織中堅持使用給定的語言級別(因為共享代碼),但特定應用程序仍然可以利用 VM 改進。
編輯:對不起!引用的推文是關于使用低于目標(例如)的源進行編譯-source 8 -target 11
,因此它與 OP 詢問的內容不同。盡管如此,即使目標保持不變,也許更新的編譯器也可以生成更好的字節碼。
PS。根據Basil的建議,讓我提一下 JDK 9+ 的javac--release
標志,它可以防止在堅持舊語言級別的同時使用較新 JDK 的 API。

TA貢獻1847條經驗 獲得超7個贊
一點也不。來源主要是關于語法。目標是關于特定的字節碼幻數和功能。
但是您可以很好地編寫符合 Java 7 的代碼,使用只有 jdk 8 或更新版本提供的單個 X 類。然后,當您使用 Java 8 jdk 時,該編譯器將找到該類 X 并構建良好。但是在 Java 7 jvm 上運行該代碼時,Java 8 類 X 丟失,導致運行時異常。
所以:強制 jdk 會阻止您使用在目標版本之后添加到 Java 的類。

TA貢獻1860條經驗 獲得超8個贊
那么有多種原因。我要指出的是在企業環境中部署。
假設您在公司中運行著數千臺維護的機器,您只是無法在每臺計算機上安裝每個版本的 java。此外,安全性通常不允許下載(通常根本無法直接訪問 Internet),并且每個可用的 Java 版本都需要在安全性方面進行維護 - 需要大量文書工作和討論(例如安全性)。
底線是:在企業中,可用的 Java 版本非常有限,而且通常不是最前沿的。
現在,假設可用版本是 Java 8?,F在,如果您希望應用程序在您必須確保的環境中運行,它實際上在可用版本上運行(如 Java 8)。如果它使用該版本中不可用的東西,它就不會運行或崩潰。本質上,這樣的應用程序根本無法在企業中使用。這意味著企業會尋找不同的解決方案,他們可以在他們的環境中實際使用。
因此,能夠告訴編譯器目標版本有助于創建一個可以并且將實際使用的應用程序(并且不會在用戶機器上崩潰)。
添加回答
舉報