Kotlin Generic Reflection Subclass - PullRequest
       30

Kotlin Generic Reflection Subclass

1 голос
/ 09 марта 2019

У меня есть функция, которая принимает 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

Ответы [ 3 ]

2 голосов
/ 09 марта 2019

Вам придется использовать дисперсию: fun testStuff(type: Class<out Bag<Int>>)

https://kotlinlang.org/docs/reference/generics.html

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

НО, если я приведу тип к его супертипу, он будет работать нормально (с предупреждением).

Ну, он также будет "работать нормально" (в зависимости от внутреннихtestStuff) если вы делаете

testStuff(String::class.java as Class<Bag<Int>>)

Из-за стирания типа Class<String> может быть приведено к Class<Anything>, и это относится и к другим универсальным типам.Но на самом деле IntBag::class.java является Class<IntBag>, а не a Class<Bag<Int>>.

На самом деле, нет значений типа Class<Bag<Int>>;если вы хотите Class<any subtype of Bag<Int>>, то ответ Памелы Хилл дает синтаксис.

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

Bag<Int> фактически отличается от IntBag, поскольку это разные классы.

Вы можете использовать typealias для IntBag, например, так:

typealias IntBag = Bag<Int>
...