我有一个使用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
答案 0 :(得分:2)
您将不得不使用方差:
Import-Clixml
答案 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.java
是Class<IntBag>
,而不是是Class<Bag<Int>>
。
实际上,没有类型Class<Bag<Int>>
的值;如果您想使用Class<any subtype of Bag<Int>>
,则Pamela Hill的答案给出了语法。