2017-07-17 287 views
2

請幫助我理解這一段代碼在科特林文檔: -科特林盒裝詮釋也不盡相同

val a: Int = 10000 
print(a === a) // Prints 'true' 
val boxedA: Int? = a 
val anotherBoxedA: Int? = a 
print(boxedA === anotherBoxedA) // !!!Prints 'false'!!! 

現在,我明白,第一個int a = 10000然後在下一行則用===比較它。

現在的問題是,爲什麼當它指定boxedA=a時,它使用int?檢查它是否爲空。可它只是這樣寫: -

val boxedA: Int=a 

請,如果我理解了錯誤的方式,有人指導,檢查正確的地方或解釋有點對我來說。

+1

雖然我不是100%肯定,我認爲'Int'是一樣的Java類'int'(基本),而''詮釋是一樣的'整數'(對象) – danielspaniol

+2

爲什麼倒票?用戶明確表示,如果他/她認識錯誤,應引導他/她。我顯然沒有看到這個問題應該被投票的原因。 –

+0

@danielspaniol也許我會讓你失望[這裏](https://stackoverflow.com/a/45144516/7607923),:) –

回答

-1

時分配boxedA = a,它檢查是否使用int?

我不知道你這個是什麼意思爲空。製作變量的類型爲Int?使其成爲一個變量,可以存儲Intnull。這項任務沒有檢查。如果你有一個非空值賦給變量,只是讓它不可爲空的,沒有的類型?

val copyOfA: Int = a 

你甚至可以省略類型,並獲得Int推斷:

val copyOfA = a 

作爲用於比較:

==被用於通過在值比較科特林(這是使用相當於in Java),===用於比較參考(這是Java中的==)。

當您創建boxedAanotherBoxedA時,您會在引擎蓋下創建兩個Integer實例(因爲可爲空的變量不能由基元表示)。與==(它們具有相同的值)相比,這些值將相等,但與===(它們是不同的實例)相比不會。

你可以看到官方文檔here的相關部分。

1

它檢查它是否爲空使用int?

這不是這個意思。

Kotlin的空安全功能默認情況下不允許將變量設置爲空。

檢查here

val anotherBoxedA: Int? = a 

這意味着anotherBoxedA可以分配空值或是可空

val anotherBoxedA: Int? = null 

這將被允許。

1

首先,Int將根據其上下文映射到java int/Integer。如果Int是一個通用參數,則其映射類型爲Integer。否則,它是一個原始類型int。例如:

val a:Int = 1 
//final int a = 1; //mapped to java code 

val numbers:List<Int> = asList(1,2,3) 
//final List<Integer> numbers = asList(1, 2, 3); //mapped to java code 

其次,拳擊的IntInt?是相同的行爲的Java拳的intInteger,例如:

val a:Int = 1 // int a = 1; 
val b:Int? = a; // Integer b = a; 

爲什麼盒裝整數不一樣?

這是因爲在該範圍[-128, 127]Integer緩存值。上面的變量a超出緩存範圍,它會爲每個裝箱創建一個新的Integer實例,而不是使用緩存的值。例如:

//    v--- 1 is in cache range 
val ranged: Int = 1 
val boxedRanged1: Int? = ranged 
val boxedRanged2: Int? = ranged 

println(boxedRanged1 === boxedRanged2) //true 

//     v--- 128 is out of cache range 
val excluded: Int = 128 
val boxedExcluded1: Int? = excluded 
val boxedExcluded2: Int? = excluded 

println(boxedExcluded1 === boxedExcluded2) //false