我有一个案例类,采用 Seq[T] 作为参数:
case class MyClass(value: Seq[T])
我现在希望能够写作
MyClass(t1,t2,t3)
所以我定义了
object MyClass {
def apply(value: T*) = new MyClass(value.toSeq)
}
它不起作用,因为案例类定义了
object MyClass {
def apply(value: Seq[T])
}
并且 Seq[T] 和 T* 在删除后具有相同的类型,因此我无法重载它们。
但我想允许这两种访问方式。两种方式都应该被允许:
MyClass(t1,t2,t3)
MyClass(some_seq_of_T)
由于 Seq[T] 和 T* 几乎是相同的类型(至少在删除之后;并且具有参数 T* 的函数内部变为 Seq[T]),我认为应该有一种方法允许两种方式调用它。
有吗?
最佳答案
你可以稍微作弊并像这样定义你的同伴:
case class MyClass[T](value: Seq[T])
object MyClass {
def apply[T](first: T, theRest: T*) = new MyClass(first :: theRest.toList)
def apply[T]() = new MyClass[T](Nil)
}
只要至少有一个参数,第一个 apply
就会处理 MyClass(1,2,3)
。
第二个 apply
处理 0 参数的情况。它们与常规构造函数不冲突。
这样你就可以编写 MyClass(Seq(1,2,3))
、MyClass(1,2,3)
和 MyClass()
。请注意,对于空的,您必须告诉它返回什么类型,否则它将采用 MyClass[Nothing]
关于Scala:重载 (Seq[T]) 和 (T*),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12512540/