请解释下面的Scala代码

时间:2016-10-01 18:29:38

标签: scala

object Demo {
   def main(args: Array[String]) {
      println( apply( layout, 10) )
   }

   def apply(f: Int => String, v: Int) = f(v)

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

在函数def layout[A](x: A)中,[A]表示什么?

3 个答案:

答案 0 :(得分:1)

它是Scala中的泛型类。 http://docs.scala-lang.org/tutorials/tour/generic-classes.html

如果你了解java,那么[A]相当于Java中的<A>

等效的Java代码如下所示:

<A> String layout(A x){
   return "[" + x.toString() + "]";
}

答案 1 :(得分:1)

> view("file + i can keep + writing + until + i close the + double quote + , but once I do, + I have to also close the parentheses ) + " + ) Error: could not find function "view" > 声明了一个名为[A]的类型参数。

在类似Haskell的语法中,此类型将写为

A

答案 2 :(得分:1)

非泛型方法使用已知类型进行参数化:

def layout(x: Int) = "[" + x.toString() + "]" //parameter x is of a known type: Int 

在上面的示例中,x显式设置为Int。但是,toString方法适用于Scala中的任何类型。因此,不要为下面的不同类型编写多个重载方法:

def layout(x: Double) = "[" + x.toString() + "]" //parameter x is of a known type: Int 

def layout(x: List[Int]) = "[" + x.toString() + "]" //parameter x is of a known type: Int 

我们可以使用类型参数编写单个泛型/多态方法:

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

上面的A称为类型参数。现在,A可以是任何类型。它是对实际类型的抽象。

您现在可以通过明确指定layout的类型来调用多态A方法:

layout[Int](2)

或者您可以像下面一样调用它,在这种情况下,Scala会自动推断出参数化类型A的类型为Int:

layout(2)