【发布时间】:2019-03-08 08:55:54
【问题描述】:
在 Kotlin 中,您可以使用这样的通用函数:
fun <T> singletonList(item: T): List<T> {
// ...
}
我不明白 fun 关键字后面的 <T> 的目的是什么。函数返回List<T>,那么<T>的意义何在?
【问题讨论】:
标签: kotlin
在 Kotlin 中,您可以使用这样的通用函数:
fun <T> singletonList(item: T): List<T> {
// ...
}
我不明白 fun 关键字后面的 <T> 的目的是什么。函数返回List<T>,那么<T>的意义何在?
【问题讨论】:
标签: kotlin
为了能够创建泛型函数,编译器必须知道您想要使用不同的类型。 Kotlin(如 Java 或 C#)是一种强类型语言。所以只是将不同的类型传递给一个函数会让编译器发疯。
要告诉编译器一个函数应该接受多种类型,你需要添加一个“类型参数”
fun 后面的<T> 是上述“类型参数”的定义。
然后用于item 参数。
现在编译器知道当您调用 singletonList(item: T) 时您将指定 item 的类型
只是在做
fun singletonList(item: T) : List<T> {[...]}
会使编译器不高兴,因为它不知道T。
(只要你没有名为T 的类)
当你用逗号分隔它们时,你也可以有多个“类型参数”:
fun <T, U> otherFunction(firstParam: T, secondParam: U): ReturnType
【讨论】:
func funcName(item: T),编译器会生你的气,因为它不知道T...这就是为什么你需要前面的<T>。这就是告诉编译器 T 是 TypeParam 的原因。 (item: T) 是用法,<T> 是定义
fun <T, U> funcName(firstParam: T, second: AnotherType, third: U): ReturnType
这是一个通用函数,根据语言的语法要求,需要提供这部分<T>。您可以使用它进一步指定T:
fun <T: Number> singletonList(item: T): List<T> {
// ...
}
拥有多个泛型类型也很常见:
fun <T: Number, R: Any> singletonList(item: T): R {
// ...
}
【讨论】: