具有特定类型的泛型类的附加构造函数

时间:2018-03-09 04:59:53

标签: scala generics

我在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.

感谢。

1 个答案:

答案 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]