如果您没有真正保养关于这种东西会有什么类型,您可以用[_,_]对它进行参数化。例子可能是一些类似
val thing = new SomeClass[_, _]()
或
def thingDoer(sc: SomeClass[_, _]) { /* Stuff */ }
更清楚它的性质了一下,下划线被称为“生存型”,它基本上是一个原始类型的等价在Java中,它也可以类似于Java的通配符类型。例如,这种精神分裂的Java代码
public void thingThatTakesAMapList(List<? extends Map> mapList) { /* Whatever */ }
是一样的,因为这Scala代码
def thingThatTakesAMapList(mapList: List[_ <: Map[_, _]]) { /* Some incredibly wild subroutine */ }
此外,值得注意的名单之区分[任何]和List [_] ...是非常微妙。前者是Any的列表,后者是[我不知道/关心]的列表。尽管如此,_ 与完全不同。例如,如果你有一类与此签名
class SillyClass[T <: Map[_, _]]
它不会是有效的做到这一点
val thing = new SillyClass[Any]()
同时可能有效期为你做这个
val thing = new SillyClass[HashMap[_, _]]()
,如果函数将SillyClass作为参数,则可以编写
def sillyClassTaker(sc: SillyClass[_])
并且确定sc是而不是将要通过类型Any进行参数化;它是通过Map [_,_]的某个未知子类进行参数化的。也就是说,下划线是占位符,但它仍然需要有效的类型参数。所以,虽然这很酷,所有...我不特别推荐使用它太多。如果你需要做一些... wildcard-y,或者根本不在乎类型参数,那么这是一个很好的选择。
如果要保存一些打字后,你可能会想尝试一个类型别名,比如'型SomeClassAny = SomeClass [AnyRef,Any]'。 – huynhjl 2011-12-28 20:05:58
一个默认的'value'(见你问题的标题)是不同的:'Foobar(b:Int = 42)';你在谈论类型参数。 – 2011-12-28 20:42:18
@huynhjl似乎'type'是最合适的解决方案。你应该将其作为回答发布 – 2011-12-28 21:30:06