我正在尝试使用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)
归档时间: |
|
查看次数: |
3663 次 |
最近记录: |