Как передать объект класса из Scala в Java?

Если они используются только в одном файле, то нет необходимости показывать их внешнему миру, включая их в заголовочный файл.

Если они используются и всегда будут использоваться только в одном месте, то на самом деле нет никакой причины не просто записывать их как литералы, где их нужно использовать.

Если бы они использовались в нескольких местах в cpp, я бы выбрал анонимное пространство имен.

Другой вариант, который вы не упомянули, - это определить их как статические переменные внутри cpp. это несколько эквивалентно опции анонимного пространства имен и более похоже на C, чем на C ++.

9
задан 15 June 2009 в 04:00
поделиться

2 ответа

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

18
ответ дан 4 December 2019 в 08:34
поделиться

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

val g = new SimpleGraph[String, DefaultEdge](classOf[DefaultEdge])
7
ответ дан 4 December 2019 в 08:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: