如何将List&lt; <myclass>转换为List <t>?

时间:2016-03-04 15:34:14

标签: kotlin

我尝试从泛型方法

返回特定列表 代码如下:

val list: List<Animal> = listOf(Animal(1), Animal(2), Animal(7))

val storage = object : Storage  {
    override fun <T> fetch(clazz: Class<T>): List<T> {
       if(clazz is Animal::class.java){
           return list
       }
        throw RuntimeException()
    }

} 

但我有一个例外:

Error:(14, 20) Kotlin: Type mismatch: inferred type is kotlin.collections.List<polar.QueryTest.Animal> but kotlin.collections.List<T> was expected

如何正确返回列表?

1 个答案:

答案 0 :(得分:6)

编译器无法确定示例中类型List<T>List<Animal>之间的关系,因此您应该使用as operator进行未经检查的强制转换。另请注意,您正在使用is operator,您可能需要使用简单的相等检查:

val list: List<Animal> = listOf(Animal(1), Animal(2), Animal(7))

val storage = object : Storage {
    fun <T> fetch(clazz: Class<T>): List<T> {
        if (clazz == Animal::class.java) {
            return list as List<T>
        }
        throw RuntimeException()
    }
}

如果未经检查的投射警告会扰乱您,您可以使用以下注释对其进行抑制:@Suppress("UNCHECKED_CAST")