【问题标题】:Understanding type Parameters in Scala理解 Scala 中的类型参数
【发布时间】:2017-01-27 17:14:17
【问题描述】:

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

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

我知道 func1 接受任何类型的 1 个参数,并返回相同类型的参数。我不明白的是为什么:

def func1[T]

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

def func1(a : T) : T = a

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

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

class MyClass[T]{...}

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

提前致谢。

【问题讨论】:

  • 关于第二点:您可能正在使用您的类,该类是其他类型对象的容器。简单的例子是 List[String]。看起来你的MyClass 可能是专业的......你有时可能有MyClass[String] 和其他一些MyClass[Boolean]

标签: scala type-parameter


【解决方案1】:
  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. 为什么我们对类做同样的事情?

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

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 将影响类级别上定义的T。这意味着它们可能不是同一类型!你可以这样称呼它:

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

【讨论】:

  • 非常感谢您的分析。 1)是的,我做错了。是 T 而不是 A。我现在更正了。 2)虽然我不确定我是否完全理解这个概念,但我认为我在理解 Scala 中的类型参数方面更加接近了。 3) 因为我的声望低于 15,所以我的投票反馈没有被记录。
  • @Spartan 现在已经超过 15 岁了 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-16
  • 1970-01-01
  • 2021-07-25
  • 2012-04-11
  • 1970-01-01
  • 1970-01-01
  • 2011-02-19
相关资源
最近更新 更多