使用可空和不可空集合的方法调用
Method call with nullable and not nullable Collection
是否可以在 Kotlin 中编写一个可以用可空和不可空集合调用的函数?我在想这样的事情:
fun <C: MutableCollection<out String>> f(c: C): C {
// ...
}
并不是说我需要这样写,因为我有一个 return 类型的值 C
。另请注意 out
关键字,但即使使用它我也无法调用 f(mutableListOf<String?>)
但 f(mutableListOf<String>)
可以正常工作。我必须在这里更改什么或者在 Kotlin 中这不可能?使用数组这会很好...
fun <C: MutableCollection<out String?>> f(c: C): C {
return c;
}
fun main(args: Array<String>) {
println(f(mutableListOf("hello")))
println(f(mutableListOf<String?>(null)))
}
我认为你在这里搞混了(参考你的评论)...Collection<out T>
的工作方式与 Array<out T>
相同。在那种情况下,T
可以通过任何方式(即 T : Any?
)...只要您将 T
设置为 String
,您基本上就是在使用 [=18] =], 那么你必须使用不可为空的类型...
虽然简短的回答是将 ?
添加到泛型类型 C
,即使用 fun <C: MutableCollection<out String?>> f(c: C):C
,但这里有一些更多示例,可能有助于更好地理解它们的作用一起:
// your variant:
fun <C : MutableCollection<out String>> f1(c: C): C = TODO()
// given type must be non-nullable; returned one therefore contains too only non-nullable types
// your variant with just another generic type
fun <T : String, C : MutableCollection<out T>> f2(c: C): C = TODO()
// you have now your "out T", but it still accepts only non-nullable types (now it is probably just more visible as it is in front)
// previous variant adapted to allow nullable types:
fun <T : String?, C : MutableCollection<out T>> f3(c: C): C = TODO()
最后,您的问题的解决方案可以是以下之一(取决于您的实际需要):
fun <T : String?> f4a(c: MutableCollection<out T>): MutableCollection<out T> = TODO()
fun <C : MutableCollection<out String?>> f4b(c: C): C = TODO()
是否可以在 Kotlin 中编写一个可以用可空和不可空集合调用的函数?我在想这样的事情:
fun <C: MutableCollection<out String>> f(c: C): C {
// ...
}
并不是说我需要这样写,因为我有一个 return 类型的值 C
。另请注意 out
关键字,但即使使用它我也无法调用 f(mutableListOf<String?>)
但 f(mutableListOf<String>)
可以正常工作。我必须在这里更改什么或者在 Kotlin 中这不可能?使用数组这会很好...
fun <C: MutableCollection<out String?>> f(c: C): C {
return c;
}
fun main(args: Array<String>) {
println(f(mutableListOf("hello")))
println(f(mutableListOf<String?>(null)))
}
我认为你在这里搞混了(参考你的评论)...Collection<out T>
的工作方式与 Array<out T>
相同。在那种情况下,T
可以通过任何方式(即 T : Any?
)...只要您将 T
设置为 String
,您基本上就是在使用 [=18] =], 那么你必须使用不可为空的类型...
虽然简短的回答是将 ?
添加到泛型类型 C
,即使用 fun <C: MutableCollection<out String?>> f(c: C):C
,但这里有一些更多示例,可能有助于更好地理解它们的作用一起:
// your variant:
fun <C : MutableCollection<out String>> f1(c: C): C = TODO()
// given type must be non-nullable; returned one therefore contains too only non-nullable types
// your variant with just another generic type
fun <T : String, C : MutableCollection<out T>> f2(c: C): C = TODO()
// you have now your "out T", but it still accepts only non-nullable types (now it is probably just more visible as it is in front)
// previous variant adapted to allow nullable types:
fun <T : String?, C : MutableCollection<out T>> f3(c: C): C = TODO()
最后,您的问题的解决方案可以是以下之一(取决于您的实际需要):
fun <T : String?> f4a(c: MutableCollection<out T>): MutableCollection<out T> = TODO()
fun <C : MutableCollection<out String?>> f4b(c: C): C = TODO()