我正在尝试使用 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 参数传递给构造函数?
最佳答案
如您所说,等效的 Scala 代码是
val g: UndirectedGraph[String, DefaultEdge] = new SimpleGraph[String, DefaultEdge](classOf[DefaultEdge])
但这可能有点枯燥,因为 Scala 可以推断构造函数的类型参数
val g: UndirectedGraph[String, DefaultEdge] = new SimpleGraph(classOf[DefaultEdge])
但这并不像它所能达到的那样干。 “DefaultEdge”类型被提及两次。您可以通过 list 获得更多 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,这种技术才值得使用
现在是一些注意事项和警告。 list 仍然被认为是实验性的。我怀疑它们太有用了,永远不会被丢弃,但没有任何保证。有关 list 的更多信息,请参阅 http://scala-blogs.org/2008/10/manifests-reified-types.html
关于java - 如何将类对象从 Scala 传递给 Java?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/994416/