java - 如何将类对象从 Scala 传递给 Java?

标签 java scala interop

我正在尝试使用 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/

相关文章:

javascript - Lift、Flot 和 JQuery

c# - 将对象转换为 void* 并返回?

c# - foreach 中的 Excel Interop CustomDocumentProperties 导致挂起

java - 通过 Android 应用程序在 Whatsapp 上共享时,显示无标题而不是文件名

java - 如何显示具有多个小数点的结果

scala - 使用 Intellij 调试 Scala 宏

.net - IntPtr、SafeHandle 和 HandleRef - 解释

java - 为什么 Servlet 的 WEB-INF 文件夹下名为 EmailList.txt 的文件没有打印输出

java - 计算字符串在字符串中出现的次数

Scala 替代无限循环