2017-07-25 127 views
2

我想将以下简单的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); 
    } 
} 

回答

2

这是一个什么样的斯卡拉类看起来像一个草图:

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而不是设置最大值字段)。如果你想解决这个问题,你可以定义一个同伴对象MyClassapply方法,它没有参数:

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]() 
+0

我得到'不找到:键入ClassTag'。 –

+0

'import reflect.ClassTag' – jwvh

+0

非常感谢。 –