Как избежать ошибки несоответствия типов с помощью kotlin generic? - PullRequest
0 голосов
/ 05 марта 2019

Фрагмент кода

fun main() {
    val myClass : AbsClass<Any> = MyClass()
    // Error - type mismatch

    val myClass : AbsClass<*> = MyClass() 
    // Not Error, but parameter of 'foo' is 'Nothing'

    val myClass : AbsClass<Any> = MyClass() as AbsClass<Any> 
    // It's correct works with unchecked cast warning and unnecessary casting code.

    myClass.foo(MyModel())
}

class MyClass() : AbsClass<MyModel>() {
}

abstract class AbsClass<T> {
    fun foo(value:T){}
}

data class MyModel(val number:Int = 0)

Вопрос

Я хочу написать код как val myClass : AbsClass<Any> = MyClass(), но он показывает ошибку несоответствия типов.Как решить эту проблему (не используйте код приведения типа as AbsClass<Any>)?

1 Ответ

0 голосов
/ 05 марта 2019

Вы должны использовать:

val myClass: AbsClass<out Any> = MyClass()` or `val myClass: AbsClass<in Nothing> = MyClass()

Ключевое слово out означает, что вы хотите, чтобы любой подтип мог быть присвоен супертипу.MyModel можно присвоить любому, так что все в порядке.

Ключевое слово in означает, что вы ожидаете, что любой подтип может быть назначен подтипу (в нашем случае Nothing), поэтому вы можете использовать свой MyModel, потому чтоэто супертип Nothing.

Таким образом, без предоставления какой-либо информации ожидаемого типа (вы можете указать, например, AbsClass<T : MyAbstractModel>), на мой взгляд, действительно мало возможностей без приведения или отражения.

Это дисперсия типа, и это одна из самых сложных идей в ООП.Подробнее вы можете прочитать здесь: https://kotlinlang.org/docs/reference/generics.html#variance

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...