我试图使用
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”类型被提到两次.你可以得到更多的干燥与清单.首先你创建一个创建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