Kotlin通用反射子类



我的功能采用Class<GenericType<Constraint>>。当我通过该GenericType<Constraint>的子类时,编译器错误带有消息: Type Inference Failed. Expected Type Mismatch

但是,如果i 将类型施加到它的超构型中,则运行良好(带有警告)。如何在不铸造的情况下执行此操作?

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>>)

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

Bag<Int>IntBag有效不同,因为它们是不同的类。

您可以像这样使用IntBag的typealias:

typealias IntBag = Bag<Int>

但是,如果我将类型施放到它的超构型,则可以正常运行(带有警告)。

好吧,如果您这样做

,它也会"运行正常"(取决于testStuff的内部)
testStuff(String::class.java as Class<Bag<Int>>)

由于类型,可以将Class<String>施加到Class<Anything>,这也适用于其他通用类型。但实际上,IntBag::class.javaClass<IntBag>不是 a Class<Bag<Int>>

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

相关内容

  • 没有找到相关文章

最新更新