2009-06-15 90 views
9

我想從Scala代碼中使用Java類庫。 (JGraphT,要準確)一個我需要調用構造函數是如何將類對象從Scala傳遞給Java?

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); 

有什麼斯卡拉相當於正確嗎?

更具體地說,我如何將DefaultEdge.class參數傳遞給構造函數?

回答

18

等效Scala代碼是,像你說的

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

但是,這DRYed了一下,因爲Scala可以推斷出你的構造函數的類型參數

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

但這並不像DRY那樣幹。 「DefaultEdge」類型會被提及兩次。清單可以得到更多的乾貨。首先創建一個用於創建SimpleGraph的工廠。

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

7

我找到了我自己的答案。相對應的是

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