Kotlin在泛型in/out的一些問題
来源:8-3 泛型的型变

慕虎0318457
2024-04-11
圖中的Dog和Cat都繼承Animal, 想請問這邊的ArrayList已經宣告成out Animal了, 但為什麼自從animals = dogList之後, 出現了特例開始可以add Dog類了, println這個類也發現Dog有確實被add進去
(其他add Animal和add Cat自然是不行, 甚至IDE還提示只能add Nothing)
類似的代碼我在Java上自然是完全不行add Dog, 更別說add其他的了
下面補充一些資訊和發現到的IDE提示
animals的類型如預期的沒有改變
但是Type mismatch的提示卻顯示Required: Dog
写回答
1回答
-
这个问题非常细致。
当泛型参数为 out Animal 时,ArrayList 确实只能 add Nothing,否则可能会违反协变规则。但是,由于 animals 是局部变量,因此当 animals = dogList 执行时,Kotlin 编译器会对 animals 进行智能类型推导,于是 animals 就被推导成 ArrayList<Dog> 了,因此可以 add Dog。
当然,后面 IDE 提示只能 add Nothing,应该是 bug。
122024-04-21
相似问题