Быстрый ответ, используйте модификатор «out»:
fun getDataTableListener(mTableFragment: DataTableFragment<Any>): DataTableListener<out Any>
Длинный ответ:
То, что вы ищете, - это дисперсия, о которой вы можете прочитать в официальных kotlin документах: https://kotlinlang.org/docs/reference/generics.html
Потому что, например, интерфейс списка выглядит так:
public interface List<out E>
Вы можете выполнить задание следующим образом:
val list: List<Any> = listOf(1,2,3)
Но это невозможно сделать:
val mutableList : MutableList<Any> = listOf(1,2,3)
Потому что MutableList не имеет модификатора "out". Это имеет смысл, поскольку MutableList можно изменить, на MutableList вы можете добавить, например, String, но он уже указывает на List.
В вашем примере вы можете использовать модификатор «out», если и только если ваш DataTableListener не использует тип generi c в качестве входных данных. Например:
interface DataTableListener<T>{
fun assignValue(t:T)
fun getValue():T
}
С интерфейсом, подобным описанному выше, вы все равно можете использовать модификатор out в своей функции, но не сможете выполнить функцию assignValue.
Whole например:
class Patient
class Observation
class DataTableFragment<T>
interface DataTableListener<T> {
fun assignValue(t: T)
fun getValue(): T
}
class TabObservationFragment : DataTableListener<Observation> {
override fun getValue(): Observation {
TODO("Not yet implemented")
}
override fun assignValue(t: Observation) {
TODO("Not yet implemented")
}
}
class TabPatientFragment : DataTableListener<Patient> {
override fun getValue(): Patient {
}
override fun assignValue(t: Patient) {
TODO("Not yet implemented")
}
}
val mTabObservationsFragment = TabObservationFragment()
val mTabPatientsFragment = TabPatientFragment()
fun getDataTableListener(mTableFragment: DataTableFragment<Any>): DataTableListener<out Any> {
val test = "observations"
if (test == "observations")
return mTabObservationsFragment
else return mTabPatientsFragment
}
fun getIt() {
val listener = getDataTableListener(DataTableFragment())
listener.assignValue("test")
}