在java中使用scala泛型类

时间:2014-02-13 22:51:56

标签: java scala scala-java-interop

我在scala中有这个:

object Tester {
  def apply[T : Manifest](description: String, initValue: T) = new Tester[T](description, initValue)
  implicit def TesterToValue[T](j: Tester[T]): T = j.value
}

class Tester[T : Manifest](someData: String, initValue: T) {
  private var value = initValue
  def getValue : T = value
}

允许我这样做

val t1 = JmxValue("some data", 4)

我试图创建一个这样的实例是java,到目前为止我还没有运气 我试过了:

Tester t1 = Tester<Integer>("data", 0);
Tester<Integer> t1 = Tester<Integer>("data", 0);
Tester t1 = Tester("data", 0);
Tester t1 = new Tester<Integer>("data", 0);
Tester<Integer> t1 = new Tester<Integer>("data", 0);

在java中使用scala泛型类是否有一些限制?或者我只是在做一些可怕的错误

1 个答案:

答案 0 :(得分:5)

您的Tester类实际上有一个隐含参数(因为[T : Manifest]类型边界。您使用的语法是糖

// Scala Class
class Tester[T](someData: String, initValue: T)(implicit man: Manifest[T]){...}

当编译它时,两个参数列表被压缩为一个,所以你最终得到了相当于java的

//Java Constructor
public Tester(String someData, T initValue, Manifest<T> man){...}

您可以通过在scala编译器生成的Tester.class文件上运行javap命令来查看类型签名。

因此,如果您尝试使用Java中的Tester类,则必须明确地找出scala编译器通常会为您找出的参数。

查看scaladocs,看起来ManifestFactory就是您需要创建Manifest实例的地方。所以你的java代码看起来像

Manifest<Integer> man = ManifestFactory$.MODULE$.classType(Integer.class);
Tester<Integer> tester = new Tester<Integer>("data", 123, man);