2009-06-15 23 views
9

Estoy tratando de usar una biblioteca de clases Java a partir del código Scala. (. JGraphT, para ser exactos) Uno de los constructores que tengo que llamar es¿Cómo pasar un objeto de clase de Scala a Java?

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

Para llamar a esto desde Java, diría:

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

¿Cuál es el equivalente correcto Scala?

Más específicamente, ¿cómo paso el argumento DefaultEdge.class al constructor?

Respuesta

18

El código Scala equivalente es, como usted dice

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

Pero eso puede Dryed un poco porque Scala puede inferir los parámetros de tipo de su constructor

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

Pero eso no es tan SECO como puede ser. El tipo "DefaultEdge" se menciona dos veces. Puedes obtener incluso más DRY con manifiestos. Primero creas una fábrica para crear SimpleGraphs.

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

Y con esto podemos crear un gráfico, ya sea con

val g = SimpleGraph[String, DefaultEdge]() 

o

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

Obviamente esta técnica es sólo vale la pena si se crea un grupo de SimpleGraphs

Ahora algunas advertencias y advertencias. Los manifiestos todavía se consideran experimentales. Sospecho que son demasiado útiles para ser eliminados, pero no hay garantías. Para obtener más información sobre los manifiestos, consulte http://scala-blogs.org/2008/10/manifests-reified-types.html

7

Encontré mi propia respuesta. El equivalente es

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