Я столкнулся со следующей проблемой: Предположим, что у нас есть class A<T>
и class B<T>
, и мы можем откуда-то получить A<*>
и B<*>
, например, у нас есть интерфейс только для чтения, например:
interface ABProvider {
fun provideA(): A<*>
fun provideB(): B<*>
}
Тогда мы знаем по некоторым внутренним логам c, что этот провайдер всегда возвращает A's
и B's
с одним и тем же параметром типа в звездных проекциях. Более формально мы знаем, что существует некая T
такая, что provideA()
возвращает A<T>
и provideB()
возвращает B<T>
одновременно.
И затем мы хотим иметь возможность делать такие вещи, как это:
fun <T> doSomething(a: A<T>, b: B<T>) {...}
val a = provider.provideA()
val b = provider.provideB()
doSomething(a, b) // <- here is the problem
Так есть ли способ решить эту проблему? Я пытался сделать что-то вроде этого:
fun <T> cast(a: A<T>, b: B<*>) = a to (b as B<T>)
, но он не работает, он говорит: «Невозможно определить параметр типа T».
Заранее спасибо.