4.1 Java語言和Kotlin語言對比(1)-基礎類型

4.1 Java語言和Kotlin語言對比(1)

void類型的映射

Java中返回void類型,對應的Kotlin返回Unit

Java中特殊標識的轉義

有些Kotlin定義的關鍵字,是Java中的合法標識名,例如in, object, is etc。如果Java庫使用一個Kotlin的關鍵字作爲函數名,可以轉義之後再調用改函數,轉義時添加 bracktick(`)字符

foo.`is`(bar)

空指針安全和平臺類型

在Java語言中,任何對象類型引用都可能是null,而在Kotlin中,強制要求從Java中引用的對象是空指針安全null-safety的。這些在Java語言中定義的類型,在Kotlin中被特殊處理,統一稱爲平臺類型 (platform types)。對於這些平臺類型的空指針檢查會寬鬆一些,對應的安全保證是和他們在Java中是一樣的。
例如,

val list = ArrayList<String>() // non-null (constructor result)
list.add("Item")
val size = list.size() // non-null (primitive int)
val item = list[0] // platform type inferred (ordinary Java object)

當我們調用平臺類型變量的方法,Kotlin在編譯期並不會報出空指針安全錯誤,這就導致在運行期可能會失敗,原因可能是一個空指針異常(NPE)或者一個Kotlin產生的阻止空指針運行的斷言。

item.substring(1) // allowed, may throw an exception if item == null

平臺類型是non-denotable 的,意思是寫的時候無法用顯示地方式。當一個平臺類型變量被賦值給一個Kotlin變量時,只能依賴類型推斷(變量會有一個推斷的平臺類型,就想上面例子中的item),或者我們可以選擇我們期待的類型,支持空指針的或者不支持空指針的都允許。

val nullable: String? = item // allowed, always works
val notNull: String = item // allowed, may fail at runtime

如果選擇了不支持空指針的類型,編譯器會針對這條賦值語句生成一個斷言。這個斷言可以防止Kotlin的不支持空指針的類型變量持有空指針。在把平臺類型通過函數參數的方式傳遞給Kotlin函數的時候,也會有同樣的斷言。總的來說,編譯器會盡最大努力去防止null影響更多的代碼和程序,儘管有時因爲泛型的原因也不可能完全消除。

平臺類型的標記

如上所述,平臺類型無法被顯示描述,所以在Kotlin語言中沒有對應的語法。儘管如此,編譯器和IDE 有時還是需要有個標記的方法,例如在錯誤消息,參數描述等信息中。

  • T! means “T or T?”,
  • (Mutable)Collection! means “Java collection of T may be mutable or not, may be nullable or not”,
  • Array<(out) T>! means “Java array of T (or a subtype of T), nullable or not”

空指針註解

Java類型的空指針註解,不是按照平臺類型來表示的,而是用真正的支持空指針或者不支持空指針的Kotlin類型。編譯器支持一些空指針註解的風格,包括
- etBrains (@Nullable and @NotNull from the org.jetbrains.annotations package)
- Android (com.android.annotations and android.support.annotations)
- JSR-305 (javax.annotation)
- FindBugs (edu.umd.cs.findbugs.annotations)
- Eclipse (org.eclipse.jdt.annotation)
- Lombok (lombok.NonNull).
具體可以參見:Kotlin compiler source code.

基礎類型的映射

Kotlin特殊處理了Java 的基礎數據類型,把他們映射成了Kotlin中的類型。這種映射的改變是在編譯時期的改變,運行時機器內存表示是保持一致的。

Java type Kotlin type
byte kotlin.Byte
short kotlin.Short
int kotlin.Int
long kotlin.Long
char kotlin.Char
float kotlin.Float
double kotlin.Double
boolean kotlin.Boolean

Java類型到Kotlin的映射

Java type Kotlin type
java.lang.Object kotlin.Any!
java.lang.Cloneable kotlin.Cloneable!
java.lang.Comparable kotlin.Comparable!
java.lang.Enum kotlin.Enum!
java.lang.Annotation kotlin.Annotation!
java.lang.Deprecated kotlin.Deprecated!
java.lang.CharSequence kotlin.CharSequence!
java.lang.String kotlin.String!
java.lang.Number kotlin.Number!
java.lang.Throwable kotlin.Throwable!

Java封裝類型到Kotlin的映射

Java type Kotlin type
java.lang.Byte kotlin.Byte?
java.lang.Short kotlin.Short?
java.lang.Integer kotlin.Int?
java.lang.Long kotlin.Long?
java.lang.Char kotlin.Char?
java.lang.Float kotlin.Float?
java.lang.Double kotlin.Double?
java.lang.Boolean kotlin.Boolean?
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章