如何将类对象从Scala传递给Java?

时间:2009-06-15 03:38:21

标签: java scala interop

我正在尝试使用Scala代码中的Java类库。 (准确地说是JGraphT。)我需要调用的一个构造函数是

public class SimpleGraph<V, E>
    extends AbstractBaseGraph<V, E>
    implements UndirectedGraph<V, E>
{
  public SimpleGraph(Class<? extends E> edgeClass) {...}
}

要从Java调用它,我会说:

UndirectedGraph<String, DefaultEdge> g = new SimpleGraph<String, DefaultEdge>(DefaultEdge.class);

什么是正确的Scala等价物?

更具体地说,如何将DefaultEdge.class参数传递给构造函数?

2 个答案:

答案 0 :(得分:18)

正如您所说,等效的Scala代码

val g: UndirectedGraph[String, DefaultEdge] = new SimpleGraph[String, DefaultEdge](classOf[DefaultEdge])

但是由于Scala可以推断出构造函数的类型参数

,因此可能会因此而减少干扰
val g: UndirectedGraph[String, DefaultEdge] = new SimpleGraph(classOf[DefaultEdge])

但这并不像它能得到的干。 “DefaultEdge”类型被提到两次。您可以通过清单获得更多干燥。首先,您创建一个用于创建SimpleGraphs的工厂。

object SimpleGraph {
  import scala.reflect.Manifest
  def apply[T, E]()(implicit mfst : Manifest[E]) = new SimpleGraph[T,E](mfst.erasure.asInstanceOf[Class[_ <: E]])
}

有了这个,我们可以用

创建一个图表
val g = SimpleGraph[String, DefaultEdge]()

val g: UndirectedGraph[String, DefaultEdge] = SimpleGraph()

显然,如果你创建了一堆SimpleGraphs

,这种技术是值得的

现在有一些警告和警告。清单仍然被认为是实验性的。我怀疑它们太有用了,不会被丢弃,但是没有保证。有关清单的更多信息,请参阅http://scala-blogs.org/2008/10/manifests-reified-types.html

答案 1 :(得分:7)

我找到了自己的答案。相当于

val g = new SimpleGraph[String, DefaultEdge](classOf[DefaultEdge])