我在Scala(2.11.8)中有一个泛型类,它工作正常。如何为特定类型添加其他构造函数?
这是原始的类定义,以及我添加额外构造函数的试验。
class MyArray[T](name: String, array: Array[T])
{
val myName = name
val values = array
override def toString = s"Name: $myName, Vals: [${values.mkString(", ")}]"
def this(name: String, min: Int, max: Int) = this(name, (min to max).toArray.asInstanceOf[Array[T]])
}
在REPL中,这就是我所看到的:
scala> val a = new MyArray("a", Array(10,12))
a: MyArray[Int] = Name: a, Vals: [10, 12]
scala> val b = new MyArray("b", Array("test", "mytest"))
b: MyArray[String] = Name: b, Vals: [test, mytest]
scala> val c = new MyArray("c", 10, 15)
c: MyArray[Nothing] = Name: c, Vals: [10, 11, 12, 13, 14, 15]
如何重写构造函数以使REPL中最后一行的输出变为MyArray[Int] = ...
?我尝试了以下方法,但没有一个有效:
def this(name: String, min: Int, max: Int) = this[Int](name, (min to max).toArray.asInstanceOf[Array[T]])
<console>:1: error: ';' expected but '[' found.
def this(name: String, min: Int, max: Int) = this[Int](name, (min to max).toArray)
<console>:1: error: ';' expected but '[' found.
def this[T](name: String, min: Int, max: Int) = this(name, (min to max).toArray.asInstanceOf[Array[T]])
<console>:1: error: no type parameters allowed here
def this(name: String, min: Int, max: Int) = MyArray[Int](name, (min to max).toArray)
<console>:1: error: 'this' expected but identifier found.
感谢。
答案 0 :(得分:4)
我不知道如何使用此构造函数来执行您所要求的操作,但这里有关于如何使用配对对象执行此操作的方法。
object MyArray {
def apply[T](name: String, array: Array[T]): MyArray[T] = {
new MyArray[T](name, array)
}
def apply(name: String, min: Int, max: Int): MyArray[Int] = {
new MyArray[Int](name, (min to max).toArray)
}
}
scala> val c = MyArray("c", 10, 15)
c: MyArray[Int] = Name: c, Vals: [10, 11, 12, 13, 14, 15]