Scala3Varargs为case类应用方法



我正在练习scala 3。我试图用一个比写一个带值的数组更简单的构造函数创建一个简单的Matrix类。所以我想使用Varargs的Seq。

Matrix(Seq(1,2,3), Seq(1,2,3))

代替:

Matrix(Seq(Seq(1,2,3), Seq(1,2,3)))
object Matrix {
def apply[T: ClassTag](arr: Seq[T]*): Option[Matrix[T]] = {
val width: Int = arr.head.length
if(arr.forall(_.length == width))
Some(new Matrix(arr))
else
None
}
}
case class Matrix[T: ClassTag] private(arr: Seq[Seq[T]])

这个示例代码在Scala 2中编译,但在Scala 3中我得到了以下错误。

method apply in object Matrix is not a legal implementation of `apply` in object Matrix
its type             [T]
(arr: Seq[Seq[T]])
(implicit evidence$2: reflect.ClassTag[T]): 
Option[com.miloszjakubanis.grid.data.Matrix[T]]
does not conform to  [T]
(arr: Seq[Seq[T]])
(implicit x$0: reflect.ClassTag[T]): 
Option[com.miloszjakubanis.grid.data.Matrix[T]]
& com.miloszjakubanis.grid.data.Matrix[T]

如果我从类中删除case关键字,编译器也将停止抱怨(但如果我想保留它呢(

我找到了一种解决方法,我认为这是由Scala 3生成自动应用函数引起的,与Scala 2不同(因此new关键字不是强制性的(

object Matrix {
def apply[T: ClassTag](arr: Seq[T]*): Option[Matrix[T]] = {
val width: Int = arr.head.length
if(arr.forall(_.length == width))
Some(new Matrix(arr*))
else
None
}
}
case class Matrix[T: ClassTag] private(arr: Seq[T]*)

相关内容

  • 没有找到相关文章

最新更新