有什么区别:
fun <T, R> List<T>.map1(transform: (T) -> R): List<R> {
return this.map(transform)
}
Run Code Online (Sandbox Code Playgroud)
和
fun <T, R> List<T>.map2(transform: (T?) -> R): List<R> {
return this.map(transform)
}
Run Code Online (Sandbox Code Playgroud)
和
fun <T, R> List<T?>.map3(transform: (T?) -> R): List<R> {
return this.map(transform)
}
Run Code Online (Sandbox Code Playgroud)
在我的测试中,null
被接受了上述所有3个变换功能,所以:有什么区别T
和T?
?
在您的示例中,T
和T?
是等效的,但在其他情况下?
确实有所不同。
当你声明一个类型参数时<T>
,它没有任何限制。它与 write 相同<T: Any?>
,这意味着T
将允许Any?
. 向?
它添加 a将使其可以为空,但Any?
已经可以为空,因此?
不会改变任何内容。这意味着无界类型允许的类型T
集与 允许的类型集相同T?
。
但是,一旦您对T
可能发生的事情施加限制,事情就会发生变化。例如,在下面的函数中,我们声明了一个类型参数<T: Any>
,将其限制为不再可以为空。
fun <T: Any> myFunction(item: T) // item can't be null
Run Code Online (Sandbox Code Playgroud)
这意味着我不能传递null
给myFunction
. 我只能叫一个函数null
的参数,如果我改变参数是的类型T?
。
fun <T: Any> myFunction(item: T?) // item can be null
Run Code Online (Sandbox Code Playgroud)
请注意,?
只是注释现有的类型参数。用 a声明类型参数?
没有任何意义,也不会编译。例如,fun <T?> myFunction(item: T)
不是有效的 Kotlin 代码。
归档时间: |
|
查看次数: |
213 次 |
最近记录: |