在Kotlin for Android Developers
本书之后,我们遇到了扩展功能
fun <T:Any> SelectQueryBuilder.parseList(parser: (Map<String,Any?>) -> T):List<T> = parseList(object:MapRowParser<T>{
override fun parseRow(columns: Map<String, Any?>): T = parser(columns)
})
我不确定为什么:Any
是必要的。
如果我将其写为fun <T> SelectQueryBuilder.parseList(...)
,则Android Studio会抱怨
当你添加:Any
时,该错误消失了。
现在,就我而言,T
应该暗示T:Any
,尽管情况显然不是这样。这是为什么?它有什么不同?
答案 0 :(得分:2)
现在,就我而言,
T:Any
应该暗示T
T:Any?
隐含Any?
,其中Object
最接近Java T:Any
。使用array1 = numpy.array([1,2])
array2 = numpy.array([[1,2],[3,4]])
A B
1 [1, 2]
2 [3, 4]
,您指定了一个不可为空的类型。
答案 1 :(得分:1)
:Any
为您的泛型类型参数定义上限。正如您可以阅读Kotlin文档的Generics: Upper Bounds章节,默认上限是Any?
:
默认上限(如果未指定)为
Any?
因此,<T>
相当于<T: Any?>