“out”关键字和“:”有什么区别?

Анд*_*нов 2 generics kotlin

有什么区别

private fun foo(list: ArrayList<out Number>) {}
Run Code Online (Sandbox Code Playgroud)

private fun <T : Number> foo(list: ArrayList<T>)
Run Code Online (Sandbox Code Playgroud)

Ten*_*r04 6

对于调用代码,对可以传递的参数的约束非常相似,但第一个稍微宽松一些,因为它声明不需要提供列表(添加到列表中)。例如,您可以将 an 传递ArrayList<Int>给其中任何一个,但不能将 an 传递ArrayList<out Int>给第二个。

对于函数内的代码,对于第一个代码,您无法向列表添加任何内容,因为它具有约束out。对于第二个,理论上您可以添加它,但前提是您有T可用的可用空间。由于T是函数签名的一部分,因此获得可用的唯一方法T是从此函数内的 ArrayList 中检索它,或者添加另一个类型为 的函数参数T