如何从Scala传递一个类对象到Java?

10

我正在尝试从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个回答

19

就像你所说的那样,等效的Scala代码是:

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

但这可能会有点DRY,因为Scala可以推断出构造函数的类型参数

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

但这还不够DRY。"DefaultEdge"类型被提到了两次。使用清单可以使它更加DRY。首先,您需要创建一个用于创建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

9
我找到了自己的答案。相当于:
val g = new SimpleGraph[String, DefaultEdge](classOf[DefaultEdge])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接