我的功能采用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.java
是Class<IntBag>
和不是 a Class<Bag<Int>>
。
实际上,Class<Bag<Int>>
类型没有值;如果您想要Class<any subtype of Bag<Int>>
,则Pamela Hill的答案给出语法。