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的答案是正确的,您可以阅读这篇文章,解释泛型的界限是如何工作的: