微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我试图使用 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐