了解 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 类型的对象对吗?
提前致谢。
func1
之后的[T]是什么意思,为什么要放在那里?
func[T]
中的[T]
定义了一个类型参数T
。您的函数可以像 func[String]("Hello")
那样调用,其中 String
被 T
替换。你也可以像 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
- 为什么我们对 classes 做同样的事情?
您经常希望在 class 中包含某种类型的对象。如果您在 class 级别定义类型参数,则类型将在整个 class 中保持不变。考虑这个例子:
class Container[T](val t: T) {
def isValueEqual(obj: T): Boolean = t.equals(obj)
}
这里,obj: T
中的T
与Container[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!
我想了解 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 类型的对象对吗?
提前致谢。
func1
之后的[T]是什么意思,为什么要放在那里?
func[T]
中的[T]
定义了一个类型参数T
。您的函数可以像 func[String]("Hello")
那样调用,其中 String
被 T
替换。你也可以像 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
- 为什么我们对 classes 做同样的事情?
您经常希望在 class 中包含某种类型的对象。如果您在 class 级别定义类型参数,则类型将在整个 class 中保持不变。考虑这个例子:
class Container[T](val t: T) {
def isValueEqual(obj: T): Boolean = t.equals(obj)
}
这里,obj: T
中的T
与Container[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!