У меня есть функция, которая принимает Class<GenericType<Constraint>>.
Когда я передаю подкласс этого GenericType<Constraint>, компилятор выдает ошибку:
Type Inference Failed. Expected Type Mismatch
Однако, если я бросить тип его супертипу, он работает нормально (с предупреждением). Как это сделать без кастинга?
open class Bag<T>
class IntBag: Bag<Int>()
fun testStuff(type: Class<Bag<Int>>) {
// Do stuff
}
testStuff(IntBag::class.java) // This won't compile
testStuff(IntBag::class.java as Class<Bag<Int>>) // This compiles with a warning, but runs fine




Вам придется использовать дисперсию:
fun testStuff(type: Class<out Bag<Int>>)
Bag<Int> эффективно отличается от IntBag, поскольку это разные классы.
Вы можете использовать typealias для IntBag следующим образом:
typealias IntBag = Bag<Int>
BUT if I cast the type to it's supertype, it runs fine (with a warning).
Что ж, он также будет «работать нормально» (в зависимости от внутренностей testStuff), если вы это сделаете.
testStuff(String::class.java as Class<Bag<Int>>)
Из-за стирания типа Class<String> можно преобразовать в Class<Anything>, и это относится и к другим универсальным типам. Но на самом деле IntBag::class.java — это Class<IntBag>, а нет — это Class<Bag<Int>>.
На самом деле значений типа Class<Bag<Int>> не существует; если вы хотите Class<any subtype of Bag<Int>>, то ответ Памелы Хилл дает синтаксис.