Как передать объект класса из Scala в Java? - PullRequest
9 голосов
/ 15 июня 2009

Я пытаюсь использовать библиотеку классов Java из кода Scala. (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 в конструктор?

Ответы [ 2 ]

18 голосов
/ 15 июня 2009

Эквивалентный код 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 / manifest-reified-types.html

7 голосов
/ 15 июня 2009

Я нашел свой ответ. Эквивалент

val g = new SimpleGraph[String, DefaultEdge](classOf[DefaultEdge])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...