2017-09-26 66 views
1

我學習Android開發可用的,我注意到該文檔的findViewById()說,鑄造其返回的對象是不必要的:確定是否Java語言的特點是特別的Android SDK(平臺)

<Android API 26 Platform> 
... resulting view is automatically cast to the target class type... 

我如果我不需要(更少的代碼來編寫和閱讀!),我更喜歡不投射,但這似乎是Java 8的一個特性。然而,我希望我的應用能夠在19歲(奇巧)的平臺上工作。

https://developer.android.com/studio/write/java8-support.html似乎並沒有涵蓋在Java中8可用的自動類型轉換,以及各種其他問題/ SO上回答表明,的Java 8的一些功能都可用所有SDK 9中

方式首先,如何判斷Java語言功能是否在我的目標SDK範圍內?其次,如何在幾年前的平臺API中支持新的語言功能?

+3

*這似乎是一個Java 8功能。* - 它與java版本無關。它取決於android SDK中的語法,在26版本中進行了更改,因此如果targetSdk 26可以使用此功能 –

+0

@TimCastelijns感謝您的澄清,但這並非完全正確:只要compileSdk> = 26,您就可以使用它,無論目標SDK如何。此外,這並不會使我的問題無效,因爲[Android支持... Java 8語言功能的子集,因平臺版本而異](https://developer.android.com/guide/platform/j8-jack.html)。 – Schollii

回答

1

如果您的compileSdkVersion is >= 26Android O您不必投擲由findViewById()返回的物體。它與java 8無關。

如果不支持或不贊成使用某個API,Android Studio將根據API顯示錯誤或警告。

0

文章指出「這與Java 8無關」。這似乎只是部分正確的,但不會使我的兩個問題無效。所以這裏是我自己的結論,基於自從我的OP之後做的額外閱讀,並且我會根據回覆來修復它。

官方文檔很明確:Android supports ... a subset of Java 8 language features that vary by platform version

請注意術語「語言功能」,而不是「API」。後者通常是指在特定SDK中定義的常量,類和類成員(以及方法,它們的簽名),並且可以從代碼訪問/調用;而「語言特性」則是諸如運算符,優先級規則,嘗試資源等等。所以,雖然「SDK」和「API」經常互換使用,但它們在Android上可能並不相同:SDK可能是API +工具(如編譯器,編譯器,用於錯誤檢查的腳本等)。

的報價意味着在SDK水平的提高,越來越多的語言的Java 8的功能規格成爲支持。關鍵字是「支持」:如果語言功能 A在SDK 27支持,但不在26,並且您使用compileSdk: 27編譯程序,並且它在具有平臺26的Android設備上正確運行(假定您的程序不使用任何新的API 27,它只是使用新的操作符等新的語言功能),玩什麼魔術?

我唯一的解釋(我希望我的OP中的第二個問題的答案)是額外的編譯,我不知道什麼時候發佈:Java字節碼(.class文件)從Java編譯器被轉換爲DEX格式。這個額外的步驟涉及一個工具,它不是API的一部分,但可能是SDK的一部分。這個DEX編譯器是語言功能得到實現:如果DEX編譯器不知道如何傳輸Java字節碼,那麼Android不支持該運算符。這表明,如果可能,新的Java字節碼可能不會轉換爲新的DEX字節碼;相反,它們被轉換爲執行舊平臺(其具有較老的Dalvik VM)中的操作的DEX字節碼的等效序列。當這樣的等價過於繁瑣而無法確定時,minSdk會受到影響(那麼老式的Dalvik虛擬機就無法運行DEX文件了)。

對於第一個問題,每個SDK可能包含「檢查規則」,檢查DEX編譯器尚未支持的Java JDK功能,從而判斷給定SDK是否支持JAVA語言功能範圍就是棉絨,並且假定棉絨標記所使用的檢查規則都是正確的(沒有誤報或否定)。

任何更正歡迎!

相關問題