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]
表示什么?
答案 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)