Scala通用参数类型传递给Java Generic容器

时间:2013-04-30 07:48:36

标签: java scala generics reflection

问题:如何将通用类型从Scala传递给Java,以便 JavaContainer 中的下一个代码不会像这样失败:

I'm instance of SomeClass
Exception in thread "main" java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
    at main.java.JavaContainer.print(JavaContainer.java:19)
    at main.scala.Main$.print(Main.scala:13)
    at main.scala.Main$.main(Main.scala:17)
    at main.scala.Main.main(Main.scala)

我有一个给定的(并且不可能从外部Jar更改Java类)这个问题我们称之为: JavaContainer

import java.lang.reflect.ParameterizedType;
public /* You can remove the final marking, the problem is still there */ final class JavaContainer<T> {
  private Class<T> clazz;
  public JavaContainer(Class<T> clazz) {
    this.clazz = clazz;
  }

  public void print() {
    /* This one works */
    try {
      T unknown = clazz.newInstance();
    } catch (InstantiationException | IllegalAccessException e) {
      e.printStackTrace();
    }
    /* This one isn't */
    Class<T> persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    System.out.println(persistentClass.getName());
  }
}

我也有Java类,它将用作类型参数: SomeClass

public class SomeClass {
    public SomeClass() {
        System.out.println("I'm instance of SomeClass");
    }
}

现在我要创建一个名为 ScalaContainer Scala

import main.java.{JavaContainer, SomeClass}

class ScalaContainer[T]()(implicit m:Manifest[T]) {
  val clazz = m.runtimeClass.asInstanceOf[Class[T]]
  val javaContainer : JavaContainer[T] = new JavaContainer[T](clazz)
}

我们还在 Main 对象中使用了我们的主要方法。

object Main {

  def print{
    val main = new ScalaContainer[SomeClass]()
    main.javaContainer.print()
  }

  def main(args: Array[String]) {
    print
  }
}

1 个答案:

答案 0 :(得分:0)

Hrmmm ..我正在尝试描绘您的代码及其正在做的事情。它提醒我使用Hibernate和通用的DAO,我已经做了很多,所以我会说你应该看看http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/reflect/TypeToken.html,它会像你设置它一样打印SomeClass。这里还有TypeTools https://github.com/jhalterman/typetools

认为如果我正确理解你的问题,这应该会让你走上正确的道路。