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回答

bennyhuo

2024-04-11

这个问题非常细致。

当泛型参数为 out Animal 时,ArrayList 确实只能 add Nothing,否则可能会违反协变规则。但是,由于 animals 是局部变量,因此当 animals = dogList 执行时,Kotlin 编译器会对 animals 进行智能类型推导,于是 animals 就被推导成 ArrayList<Dog> 了,因此可以 add Dog。

当然,后面 IDE 提示只能 add Nothing,应该是 bug。


1
2
bennyhuo
回复
慕虎0318457
支持add dog是feature,不是bug。不过我觉得后面代码提示里面参数类型是nothing可能是bug。
2024-04-21
共2条回复

学会Kotlin 突破开发语言瓶颈

如果有一门语言可以取代Java,那么它一定是Kotlin。

1760 学习 · 481 问题

查看课程