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

9 java interop scala

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

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

要从Java中调用它,我会说:

UndirectedGraph<String, DefaultEdge> g = new SimpleGraph<String, DefaultEdge>(DefaultEdge.class);
Run Code Online (Sandbox Code Playgroud)

什么是正确的Scala等价物?

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

Jam*_*Iry 18

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

val g: UndirectedGraph[String, DefaultEdge] = new SimpleGraph[String, DefaultEdge](classOf[DefaultEdge])
Run Code Online (Sandbox Code Playgroud)

但是,由于Scala可以推断出构造函数的类型参数,因此可能会因此而减少干扰

val g: UndirectedGraph[String, DefaultEdge] = new SimpleGraph(classOf[DefaultEdge])
Run Code Online (Sandbox Code Playgroud)

但这并不像它能得到的那么干."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]])
}
Run Code Online (Sandbox Code Playgroud)

有了这个,我们可以创建一个图表

val g = SimpleGraph[String, DefaultEdge]()
Run Code Online (Sandbox Code Playgroud)

要么

val g: UndirectedGraph[String, DefaultEdge] = SimpleGraph()
Run Code Online (Sandbox Code Playgroud)

显然,如果你创建了一堆SimpleGraphs,这种技术是值得的

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


小智 7

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

val g = new SimpleGraph[String, DefaultEdge](classOf[DefaultEdge])
Run Code Online (Sandbox Code Playgroud)