Kotlin上界:“任何”对Kotlin的泛型类型推断有什么不同?

时间:2018-05-09 08:13:45

标签: android generics types kotlin type-inference

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会抱怨

error message

当你添加:Any时,该错误消失了。

现在,就我而言,T应该暗示T:Any,尽管情况显然不是这样。这是为什么?它有什么不同?

2 个答案:

答案 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?>