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? |