我正在尝试使用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参数传递给构造函数?
答案 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])