请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

Kotlin在泛型in/out的一些問題

图片描述
圖中的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。


1 回复 有任何疑惑可以回复我~
  • 提问者 慕虎0318457 #1
    所以這邊我可以視為因為Kotlin智能類型推導所引起的小漏洞,導致編譯器放行add Dog這種方法(但其實是違反協變規則的),因為同樣的代碼在Java是不可能放行的,至於IDE提示add Nothing我猜想應該是基於協變規則,也就是在我聲明out animal的當下IDE就會把這類add參數自動改為nothing類型,這樣理解應該沒錯吧?
    回复 有任何疑惑可以回复我~ 2024-04-12 14:17:18
  • bennyhuo 回复 提问者 慕虎0318457 #2
    支持add dog是feature,不是bug。不过我觉得后面代码提示里面参数类型是nothing可能是bug。
    回复 有任何疑惑可以回复我~ 2024-04-21 23:21:05
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号