10 Stimmen

Wie kann man ein Klassenobjekt von Scala an Java übergeben?

Ich versuche, eine Java-Klassenbibliothek aus Scala-Code zu verwenden. (JGraphT, um genau zu sein.) Einer der Konstruktoren, die ich aufrufen muss, ist

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

Um dies von Java aus zu sagen, würde ich sagen:

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

Was ist die korrekte Entsprechung in Scala?

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

19voto

James Iry Punkte 19307

Der entsprechende Scala-Code ist, wie Sie sagen

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

Aber das kann DRYed up ein bisschen, weil Scala kann die Typ-Parameter Ihrer Konstruktor inferieren

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

Aber trockener kann es gar nicht werden. Der Typ "DefaultEdge" wird zweimal erwähnt. Mit Manifesten kann man noch mehr DRY erreichen. Zuerst erstellen Sie eine Fabrik für die Erstellung 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 einen Graphen erstellen mit entweder

val g = SimpleGraph[String, DefaultEdge]()

o

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

Natürlich lohnt sich diese Technik nur, wenn Sie eine Reihe von SimpleGraphs erstellen

Nun einige Vorbehalte und Warnungen. Manifeste werden immer noch als experimentell betrachtet. Ich vermute, dass sie zu nützlich sind, um jemals fallen gelassen zu werden, aber es gibt keine Garantien. Mehr über Manifeste finden Sie unter http://scala-blogs.org/2008/10/manifests-reified-types.html

9voto

Ich habe meine eigene Antwort gefunden. Die Entsprechung lautet

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X