2009-06-15 9 views
9

Ich versuche eine Java-Klassenbibliothek aus Scala-Code zu verwenden. (. JGraphT, um genau zu sein) Einer der Konstrukteure Ich nenne müssen, istWie übergibt man ein Klassenobjekt von Scala an Java?

public class SimpleGraph<V, E> 
    extends AbstractBaseGraph<V, E> 
    implements UndirectedGraph<V, E> 
{ 
    public SimpleGraph(Class<? extends E> edgeClass) {...} 
} 

diese von Java zu nennen, würde ich sagen:

UndirectedGraph<String, DefaultEdge> g = new SimpleGraph<String, DefaultEdge>(DefaultEdge.class); 

Was Äquivalent der richtige Scala ist?

Genauer gesagt, wie übergebe ich das DefaultEdge.class-Argument an den Konstruktor?

Antwort

18

Der äquivalente Scala-Code ist, wie Sie

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

sagen Aber das Dryed kann ein wenig, weil Scala die Art Parameter Ihres Konstruktor ableiten kann

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

Aber das ist nicht so trocken wie es nur geht. Der Typ "DefaultEdge" wird zweimal erwähnt. Mit Manifesten können Sie noch mehr DRY erhalten. Zuerst erstellen Sie eine Factory zum Erstellen von SimpleGraphs.

object SimpleGraph { 
    import scala.reflect.Manifest 
    def apply[T, E]()(implicit mfst : Manifest[E]) = new SimpleGraph[T,E](mfst.erasure.asInstanceOf[Class[_ <: E]]) 
} 

Und damit können wir ein Diagramm mit entweder

val g = SimpleGraph[String, DefaultEdge]() 

oder

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

Offensichtlich ist diese Technik nur lohnt es erstellen, wenn Sie eine Reihe von SimpleGraphs erstellen

Jetzt einige Vorbehalte und Warnungen. Manifeste gelten immer noch als experimentell. Ich vermute, dass sie zu nützlich sind, um jemals fallen gelassen zu werden, aber es gibt keine Garantien. Für mehr über Manifeste siehe http://scala-blogs.org/2008/10/manifests-reified-types.html

7

Ich fand meine eigene Antwort. Das entspricht

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