了解 Scala 中的类型参数

Understanding type Parameters in Scala

我想了解 Scala 中的类型参数。让我们看下面的一般示例:

def func1[T](a : T) : T = a

我知道 func1 有 1 个任何类型的参数,returns 那个参数是相同类型的。我不明白的是为什么:

def func1[T]

为什么 [T] 紧接在 function1 之后??我们可以简单地在 func1 之后不写 [T],例如:

def func1(a : T) : T = a

1) func1 后面的 [T] 是什么意思,为什么我们把它放在那里?

2) 为什么我们对 类 做同样的事情?

class MyClass[T]{...}

我的意思是 MyClass 实例化是 MyClass 类型。 [T] 是什么意思? 你不是说我有一个 MyClass 类型的布尔值 Class,你说我有一个 MyClass 类型的对象对吗?

提前致谢。

  1. func1之后的[T]是什么意思,为什么要放在那里?

func[T]中的[T]定义了一个类型参数T。您的函数可以像 func[String]("Hello") 那样调用,其中 StringT 替换。你也可以像 func("Hello") 这样称呼它,因为 Scala 编译器足够聪明,可以推断出 T 必须是 String.

那为什么我们定义的时候一定要写func[T]呢?我们需要区分由类型参数给出的类型参数和由实际类型给出的参数。如果这样写:def func1(a : T) : T = a,那么 T 必须是实际类型。例如:

class T

def func1(a : T) : T = a  // <-- This compiles now
  1. 为什么我们对 classes 做同样的事情?

您经常希望在 class 中包含某种类型的对象。如果您在 class 级别定义类型参数,则类型将在整个 class 中保持不变。考虑这个例子:

class Container[T](val t: T) {
    def isValueEqual(obj: T): Boolean = t.equals(obj)
}

这里,obj: T中的TContainer[T]中定义的T是同一类型。现在考虑这个例子:

class Container[T](val t: T) {
    def isValueEqual[T](obj: T): Boolean = t.equals(obj)
}

请注意,我也在方法级别定义了一个新类型参数 (isValueEqual[T])。在这种情况下,方法中定义的 T 将覆盖 class 级别上定义的 T。这意味着它们可能不是同一类型!你可以这样称呼它:

val c = new Container("Hello")
println(c.isValueEqual(5)) // 5 is not of type String!