立即浏览Play Form
源代码并遇到此
def bindFromRequest()(implicit request: play.api.mvc.Request[_]): Form[T] = {
我猜它将请求作为类型bindFromRequet(request)
的隐式参数(您不必调用play.api.mvc.Request[_]
)并返回包含在Form类中的泛型T
类型。但是[_]
意味着什么。
答案 0 :(得分:1)
该方法不会使用play.api.mvc.Request
,而是使用其他类型参数化play.api.mvc.Request
。您可以为type参数指定名称:
def bindFromRequest()(implicit request: play.api.mvc.Request[TypeParameter]): Form[T] = {
但是,由于您并未在其他任何地方引用TypeParameter
,因此使用下划线代替它。我认为下划线是一种特殊的黑洞'在这里,而不是在类型签名的其他地方可以称为_
的常规名称。
答案 1 :(得分:1)
符号Foo[_]
是存在类型的简写:
Foo[A] forSome {type A}
因此它通过存在量化与普通类型参数不同。必须有某种类型,因此您的代码类型会检查您为方法或特征使用类型参数的位置,它必须为每种类型A键入check。
例如,这很好:
val list = List("asd");
def doSomething() {
val l: List[_] = list
}
这不会出现类型问题:
def doSomething[A]() {
val l: List[A] = list
}
所以存在类型在你从某个地方获得某些参数化类型的情况下非常有用,但你不知道并关心参数(或者只关注它的某些边界等)。
一般来说,你应该避免使用存在类型,因为它们会很快变得复杂。在设计类层次结构时,可以使用方差注释来避免许多实例(尤其是Java中已知的用法(在那里称为通配符类型))。