我想将以下简单的java代码转换为scala代码。我知道T <: Comparable[T]
将用于T extends Comparable
。对于泛型类型数组,我必须使用Manifest
或ClassManifest
,但我无法转换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);
}
}
答案 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]()