Kotlin Upper Bound: Какое значение имеет `: Any` для вывода родового типа Kotlin? - PullRequest
0 голосов
/ 09 мая 2018

Следуя книге 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 голосов
/ 09 мая 2018

:Any определяет верхнюю границу для вашего аргумента универсального типа.Как вы можете прочитать в главе Generics: Upper Bounds документации Kotlin, верхняя граница по умолчанию - Any?:

Верхняя граница по умолчанию (если не указано) -Any?

Таким образом, <T> эквивалентно <T: Any?>

0 голосов
/ 09 мая 2018

Теперь, насколько я понимаю, T должно означать T:Any

T подразумевает T:Any?, где Any? является наиболее близким эквивалентом Object в Java. С помощью T:Any вы указали необнуляемый тип.

...