如何使用泛型类型数组和泛型类型作为构造函数中的参数?

时间:2017-07-25 08:58:05

标签: scala

我想将以下简单的java代码转换为scala代码。我知道T <: Comparable[T]将用于T extends Comparable。对于泛型类型数组,我必须使用ManifestClassManifest,但我无法转换scala代码的两个构造函数。

public class MyClass<T extends Comparable> {

    private static int MAX_SIZE = 40;
    private T[] array;
    private int count = 0;

    public MyClass(Class<T> clazz) {
        this(clazz, MAX_SIZE);
    }

    public MyClass(Class<T> clazz, int size) {
        array = (T[]) Array.newInstance(clazz, size);
    }
}

1 个答案:

答案 0 :(得分:3)

这是Scala类的样子的粗略草图:

import scala.reflect.ClassTag

class MyClass[T : Ordered : ClassTag](size: Int) {
  val arr: Array[T] = new Array[T](size)

  def this() {
    this(40)
  }
}

由于Scala辅助构造函数初始化顺序,您无法在构造函数内访问this(这就是我硬编码40而不是设置最大值字段的原因)。如果您想绕过它,可以使用MyClass方法定义apply的伴随对象,该方法不带参数:

import scala.reflect.ClassTag

class MyClass[T : Ordered : ClassTag](size: Int) {
  val arr: Array[T] = new Array[T](size)
}

object MyClass {
  final val maxSize: Int = 40
  def apply[T : Ordered : ClassTag]() = new MyClass[T](maxSize)
}

然后像这样使用它:

val clz = MyClass[Int]()
相关问题