Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics Kotlin:在我的泛型函数中未选中强制转换_Generics_Kotlin_Casting - Fatal编程技术网

Generics Kotlin:在我的泛型函数中未选中强制转换

Generics Kotlin:在我的泛型函数中未选中强制转换,generics,kotlin,casting,Generics,Kotlin,Casting,我正在尝试使用泛型将我的两个函数合并为一个 fun <T> List<T>.toElementOrSize1(keySelector: (T) -> String): String { val key = keySelector(first()) return if (all { keySelector(it) == key }) key else "size = $size" } fun <T> List<T>.toEle

我正在尝试使用泛型将我的两个函数合并为一个

fun <T> List<T>.toElementOrSize1(keySelector: (T) -> String): String {
    val key = keySelector(first())
    return if (all { keySelector(it) == key }) key else "size = $size"
}

fun <T> List<T>.toElementOrSize2(keySelector: (T) -> String?): String? {
    val key = keySelector(first())
    return if (all { keySelector(it) == key }) key else "size = $size"
}
fun List.toElementOrSize1(keySelector:(T)->String):String{
val key=keySelector(first())
返回if(all{keySelector(it)==key})键else“size=$size”
}
有趣的列表。toElementOrSize2(键选择器:(T)->字符串?:字符串?{
val key=keySelector(first())
返回if(all{keySelector(it)==key})键else“size=$size”
}
我可以这样写:

fun <T, K : String?> List<T>.toElementOrSize(keySelector: (T) -> K): K {
    val key = keySelector(first())
    return if (all { keySelector(it) == key }) {
        key
    } else {
        "size = $size" as K
    }
}
fun List.toElementOrSize(keySelector:(T)->K):K{
val key=keySelector(first())
返回if(所有{keySelector(it)=key}){
钥匙
}否则{
“大小=$size”作为K
}
}
这是有效的,但我有一个未经检查的演员警告

为什么发出这一警告? 如何避免这种警告


谢谢。

编译器不够复杂,无法看出
K
的唯一可能类型是
String
String?
(因为
String
是最终的),因此对于编译器来说,K可能是
String?
的其他子类型,因此转换文本
String
可能不安全。由于
K
是泛型类型,因此由于类型擦除,强制转换未被选中


在使用泛型时,会出现许多类似的情况。这并不意味着你一定做了错事,只是编译器不知道你做了什么。您可以在函数或语句之前使用
@Suppress(“UNCHECKED_CAST”)
删除警告并确认您知道这是一个安全强制转换。这并不意味着你在做一些粗制滥造或设计拙劣的事情。它在标准库源代码中使用过多次。

你能描述一下你的函数应该做什么吗?@IR42我想如果我理解得很好,他想在lambda返回非null值时返回一个不可为null的字符串,在lambda返回可为null值时返回一个可为null的字符串。Tenfour04的答案是正确的,您可以阅读这篇文章,解释泛型的界限是如何工作的: