def布局[A](x:A)= ... Scala中的语法

时间:2016-10-04 17:58:21

标签: scala

我是Scala的初学者,他正在努力学习Scala语法。 我从https://www.tutorialspoint.com/scala/higher_order_functions.htm获得了代码。

我知道(x:A)是布局函数的参数 (这意味着类型A的参数x)

但是布局和(x:A)之间的[A]是什么?

我一直在使用scala函数语法,无法找到它。

def layout[A](x: A) = "[" + x.toString() + "]"

3 个答案:

答案 0 :(得分:7)

这是一个类型参数,意味着该方法已参数化(有些也称为“通用”)。没有它,编译器会认为x: A表示某个具体类型A的变量,当它找不到任何这样的类型时,它会报告编译错误。

这在静态类型语言中相当常见;例如,Java有相同的东西,只有语法是<A>

参数化方法具有可以发生类型的规则,其涉及协方差和逆变的概念,表示为[+A][-A]。方差绝对不在这个问题的范围内,对你来说现在可能太过分了,但这是一个重要的概念所以我想我只是提到它,至少让你知道那些加号和减号是什么意思当你看到他们(你会)。

此外,类型参数可以是上限或下限,表示为[A <: SomeType][A >: SomeType]。这意味着泛型参数需要是另一种类型的子类型/超类型,在本例中为伪造类型SomeType

还有更多的构造提供了有关类型的额外信息(例如,用于类型类机制的上下文边界,表示为[A : Foo]),但稍后您将了解这些内容。

答案 1 :(得分:0)

这意味着该方法使用泛型类型作为其参数。您传递的每个具有.toString定义的类型都可以通过layout传递。

例如,您可以将intstring个参数传递给布局,因为您可以在这两个参数上调用.toString

val i = 1
val s = "hi"

layout(i) // would give "[1]"
layout(s) // would give "[hi]"

如果没有gereric参数,对于此示例,您必须为布局编写两个定义:一个接受整数作为参数,另一个接受字符串作为参数。更糟糕的是:每当你需要另一种类型时,你必须编写另一种接受它的定义。

看一下这个例子here,你会更好地理解它。

我还建议你看一下通用类here

答案 2 :(得分:0)

A是一个类型参数。它不是数据类型本身(例如case class A),而是允许函数接受任何数据类型。所以这两个都可行:

  1. layout(123f) [Float数据类型]将输出:“[123]”
  2. layout("hello world") [String datatype]将输出:“[hello world]”
  3. 因此,无论传递哪种数据类型,该函数都将允许。这些类型参数也可以指定规则。这些被称为逆变和协方差。 Read more about them here!