2014-10-20 65 views
0

我见过[A]playframework site。我发现[T]意味着任何类型, [S]是为子类型。但我找不到[A]。有趣的是,它在函数名称后面使用(logging)。Scala中的[A]是什么?

import play.api.mvc._ 

def logging[A](action: Action[A])= Action.async(action.parser) { request => 
    Logger.info("Calling action") 
    action(request) 
} 

那么,在Scala中的含义是什么?

+1

http://stackoverflow.com/questions/5354803/scala-type-parameter-bracket – MNie 2014-10-20 05:06:15

+0

像Java中的''。如果你不知道两者,请阅读“泛型”。 – Radian 2014-10-20 05:27:22

+1

“[S]用于子类型” - 您从哪里听到的? – 2014-10-20 05:46:25

回答

2

您可以在Scala中为通用类型选择任何名称。所以A这里只是一个泛型类型的名称。相反,它可能是logging[T]

欲了解更多信息,你可以参考Scala generic ClassesTwitter Scala School

顺便说一句,请注意制造一个函数(或方法),一般你必须把泛型类型括号中的函数名后:

def myFunc[T](someStuff: T): Boolean = .... 

def myFunc[T](someString: String): T = .... 
-1

这只是一种文化差异。 Java社区使用T,而Scala社区使用A,出于同样的原因,在相同的情况下。

+0

你的观点是有效的。我的意思是通过阅读Java标准库代码并将其与Scala标准库代码进行比较,您会发现Java中的'T'和Scala中的'A'都是。但我想从这个人不能得出这是一个文化差异。至少在Scala社区(以Play Play,Slick,Lift等为例)中,您会发现泛型类型的不同名称。所以我想提一下,这只是一个泛型类型的任意名称,对于这个问题会更好。 – 2014-10-24 15:32:16

4

的括号内的A只是任意类型参数占位符。无论你想使用什么,它都可能是B,C。 T的使用并不特指“类型”,S并不特指“子类型” - 这恰好是一些图书馆使用的惯例。

很多时候你可能会使用一个字母作为备忘录来表示一个特定的类型参数,例如M可能被用于像Monoid,Monads等类似的东西是很常见的......