Scala:重载(Seq [T])和(T*)

Hei*_*nzi 5 types scala overloading type-erasure

我有一个案例类,以Seq [T]作为参数:

case class MyClass(value: Seq[T])
Run Code Online (Sandbox Code Playgroud)

我现在希望能够写作

MyClass(t1,t2,t3)
Run Code Online (Sandbox Code Playgroud)

所以我定义了

object MyClass {
    def apply(value: T*) = new MyClass(value.toSeq)
}
Run Code Online (Sandbox Code Playgroud)

它不起作用,因为case类定义了

object MyClass {
    def apply(value: Seq[T])
}
Run Code Online (Sandbox Code Playgroud)

并且擦除后Seq [T]和T*具有相同的类型,因此我不能使它们超载.

但是我想允许两种访问方式.应该允许两种方式:

MyClass(t1,t2,t3)
MyClass(some_seq_of_T)
Run Code Online (Sandbox Code Playgroud)

由于Seq [T]和T*几乎是相同类型(至少在擦除之后;并且在具有参数T*的函数内部变为Seq [T]),我认为应该有一种方法允许两种方式调用它.

在那儿?

Dyl*_*lan 6

你可以欺骗一点,然后像这样定义你的同伴:

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)
}
Run Code Online (Sandbox Code Playgroud)

只要至少有一个参数,第一个apply处理MyClass(1,2,3).scond apply处理0参数的情况.它们与常规构造函数不冲突.

这样,你可以写MyClass(Seq(1,2,3)),MyClass(1,2,3)MyClass().请注意,对于空的,你必须告诉它要返回什么类型,否则它会假设一个MyClass[Nothing]