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]