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

标签 scala types overloading type-erasure

我有一个案例类,采用 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/

相关文章:

scala - 从案例类中提取给定类型的值

scala - 后台作业服务,如何确保每个集群的作业只定期运行一次

java - 从 java.util.Date 转换为 java.sql.Timestamp 的问题

ios - Swift:返回 self 类型的数组

c++ - 重载插入运算符 : no operator found which takes a right-hand operand of type 'unsigned int' (or there is no acceptable conversion)

scala - 为什么 Scala 的类型推断器无法解决这个问题?

scala - 有没有办法让ArrowAssoc在模式匹配中工作?

C++ 友元重载运算符 <<

java - 如何自动将 Object 引用转换为实例类型?

java - 多参数重载函数