我是Kotlin的初學者,下面的代碼來自網頁,val box3是正確的。爲什麼在Kotlin中val box1和val box2都是正確的?
我被告知val box1和val box2都是正確的。爲什麼?
class Box<T>(val value: T)
val box1: Box<Int> = Box<Int>(1)
val box2: Box<Int> = Box(1)
val box3 = Box(1)
我是Kotlin的初學者,下面的代碼來自網頁,val box3是正確的。爲什麼在Kotlin中val box1和val box2都是正確的?
我被告知val box1和val box2都是正確的。爲什麼?
class Box<T>(val value: T)
val box1: Box<Int> = Box<Int>(1)
val box2: Box<Int> = Box(1)
val box3 = Box(1)
所有這三行都是「正確的」,並以完全相同的方式創建完全相同的實例。他們只是使用Kotlin提供的各種級別的類型推斷(即它可以從上下文中自行計算出類型和類型參數),從最詳細的第一個到最簡潔的最後一個。
由於這些行的內容完全沒有區別,所以您最好選擇使用哪一個最具可讀性。
看起來Kotlin是根據您爲Box構造函數提供的值推斷出的類型。它們都是有效的,因爲編譯器可以發現通用類型T
將是一個類型Int
。有可能如果你更明確一些編譯時優化,但我認爲這主要是一個偏好問題。
構造函數的值參數1
的類型爲T
,而Box<T>
具有相同的類型參數T
。
編譯器知道1
具有類型Int
,所以 T
= Int
,使得Box(1)
= Box<Int>(1)
。
Box<Int>(1)
的類型是Box<Int>
普通,所以box2
和box3
的類型都是Box<Int>
。
他們是正確的,但並不總是相同的。讓他們一一瀏覽。
val box1: Box<Int> = Box<Int>(1)
val box3 = Box(1)
第一個聲明box1
是Box<Int>
而box3
讓編譯器要弄清楚什麼是它的類型。它們並不總是相同的。 考慮Box<T>
實現接口IBox<T>
。
val box1: IBox<Int> = Box<Int>(1)
val box3 = Box(1)
BOX1可以是實現IBOX而box3
是Box<Int>
任何對象。
Box<Int>(1)
Box(1)
這與上面的類似。第一個明確聲明,第二個讓編譯器弄清楚。因爲1
是Int
,所以相同。但是,這並非總是如此。
Box<Number>(1)
Box(1)
這使第一個Box<Number>
代替Box<Int>
好一點,通過給予一個明確的類型,你可以使用的東西比推斷類型人。但是OP的三個例子*是相同的,這就是問題所在。 – RobCo