簡體   English   中英

如何將類對象從Scala傳遞給Java?

[英]How to pass a class object from Scala to 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

我找到了自己的答案。 相當於

val g = new SimpleGraph[String, DefaultEdge](classOf[DefaultEdge])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM