Kotlin通用反射子类

时间:2019-03-09 01:50:57

标签: java generics kotlin covariance

我有一个使用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 个答案:

答案 0 :(得分:2)

您将不得不使用方差: Import-Clixml

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

答案 1 :(得分:0)

Bag<Int>IntBag实际上是不同的,因为它们是不同的类。

您可以像这样使用IntBag的类型别名:

typealias IntBag = Bag<Int>

答案 2 :(得分:0)

  

但是,如果我将类型转换为它的超类型,它会很好地运行(带有警告)。

如果这样做的话,它也会“运行正常”(取决于testStuff的内部)

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

由于类型擦除,可以将Class<String>强制转换为Class<Anything>,这也适用于其他通用类型。但实际上,IntBag::class.javaClass<IntBag>,而不是Class<Bag<Int>>

实际上,没有类型Class<Bag<Int>>的值;如果您想使用Class<any subtype of Bag<Int>>,则Pamela Hill的答案给出了语法。