Generics 默认通用值

Generics 默认通用值,generics,scala,Generics,Scala,假设我有一门课: class SomeClass[+A <: AnyRef, +B <: Any] class SomeClass[+A这个怎么样 scala> :paste // Entering paste mode (ctrl-D to finish) class SomeClass[+A <: AnyRef] object SomeClass { def apply() = new SomeClass[AnyRef] } // Exiting past

假设我有一门课:

class SomeClass[+A <: AnyRef, +B <: Any]
class SomeClass[+A这个怎么样

scala> :paste
// Entering paste mode (ctrl-D to finish)

class SomeClass[+A <: AnyRef]

object SomeClass {
  def apply() = new SomeClass[AnyRef]
}

// Exiting paste mode, now interpreting.

defined class SomeClass
defined module SomeClass

scala> SomeClass()
res47: SomeClass[AnyRef] = SomeClass@4f63b5
scala>:粘贴
//进入粘贴模式(按ctrl-D键完成)
类SomeClass[+A SomeClass()
res47:SomeClass[AnyRef]=SomeClass@4f63b5
编辑:


我认为您需要类似于默认参数的东西,但在类型级别。不幸的是Scala没有任何此类功能。您可以使用@hyhnhjl建议的类型别名。在我看来,这似乎是您的最佳选择。

通常可以从构造函数参数的类型推断出来,但是如果构造函数不接受任何参数,则必须使用明确指定类型。当然,正如missingfaktor所指出的,您总是可以为此编写一个方法以节省键入时间。

如果您不真正关心这件事将具有什么类型,您可以使用[\u,\u]对其进行参数化。例如

val thing = new SomeClass[_, _]()

为了更清楚地了解其本质,下划线被称为“存在类型”,它基本上等同于Java中的原始类型,它的功能也可以类似于Java中的通配符类型

public void thingThatTakesAMapList(List<? extends Map> mapList) { /* Whatever */ }
而您这样做是否有效

val thing = new SillyClass[Any]()
val thing = new SillyClass[HashMap[_, _]]()
而且,如果一个函数将一个SillyClass作为参数,您可以编写

def sillyClassTaker(sc: SillyClass[_])

确保sc不会在类型Any上参数化;它在Map[\uu,\uu]的某个未知子类上参数化。也就是说,下划线是一个占位符,但它仍然要求在其位置存在有效的类型参数。因此,尽管这很酷,但我并不特别建议使用它太多。如果您需要做一些事情…通配符-y,或者根本不关心类型参数,那么考虑但是,der。

正如我在评论中建议的那样,这样做可以节省一些输入,而且非常简单:

type SomeClassAny = SomeClass[AnyRef, Any]

请重新考虑我的问题-我已经做了一些更正。我很抱歉最初没有说得那么清楚。请重新考虑我的问题-我已经做了一些更正。我很抱歉最初没有说得那么清楚。如果您保存了一些键入内容,您可能需要尝试一种类型别名,如
type SomeClassAny=SomeClass[AnyRef,Any]
。默认的
(参见问题的标题)与此不同:
类Foobar(b:Int=42)
;你说的是类型参数。@huynhjl似乎
类型
是最合适的解决方案。你应该将其作为答案发布感谢你的解释。但是
列表之间的实际区别是什么[_
val thing = new SillyClass[HashMap[_, _]]()
def sillyClassTaker(sc: SillyClass[_])
type SomeClassAny = SomeClass[AnyRef, Any]