Я определил неявные преобразования в object
. Назовем объект Implicits
, и в нем есть одно неявное преобразование.Scala: Импортирование неявных преобразований во всех подпакетах некоторого пакета
package com.gmail.naetmul.stackoverflow.app
object Implicits {
implicit def int_to_intEx(x: Int): IntEx = IntEx(x)
}
Этот объект привязан к объекту. Я хочу использовать это неявное преобразование в каждом коде в пакете com.gmail.naetmul.stackoverflow.app
и всех его подпакетах, например com.gmail.naetmul.stackoverflow.app.something.anything.everything
.
Таким образом, я сделал объект упаковки com.gmail.naetmul.stackoverflow.app
.
package com.gmail.naetmul.stackoverflow
package object app {
import com.gmail.naetmul.stackoverflow.app.Implicits._
}
Но это не сработало за пределами точного объекта упаковки. Итак, я изменил объект Implicits
на trait
, и пусть объект пакета расширяет его.
package com.gmail.naetmul.stackoverflow.app
trait Implicits {
implicit def int_to_intEx(x: Int): IntEx = IntEx(x)
}
package com.gmail.naetmul.stackoverflow
import com.gmail.naetmul.stackoverflow.app.Implicits
package object app extends Implicits {
// some code
}
Неявное работал в пакете com.gmail.naetmul.stackoverflow.app
. Однако он либо работал, либо не работал в подпакетах.
Например)
Файл A.scala
package com.gmail.naetmul.stackoverflow.app.database
class A {
// Here, the implicit conversion did NOT work.
}
Файл B.scala
package com.gmail.naetmul.stackoverflow.app
package database
class B {
// Here, the implicit conversion DID work.
}
Так что вопрос:
Должен ли я использовать
trait
вместоobject
в этом случае (с использованием объекта пакета, но определенного снаружи)?Есть ли другой способ использования неявных преобразований в подпакетах? Я имею в виду, импортировать только один раз и использовать их везде. Способ, который работал в
B.scala
, кажется прекрасным, но инструкция по умолчанию пакета Eclipse похожа наA.scala
, поэтому я должен изменить их вручную.
Пакет декларация многострочного в B.scala является способом получить поведение, которое вы хотите. Если вы поместите его на одну строку, например A.scala, вы получите только пакетный объект для этого пакета. Я не верю, что есть другой способ добиться этого. Поэтому я бы подумал, что вы застряли в том, чтобы либо вручную изменить эти объявления, либо убедить Eclipse сделать это. Я использую IntelliJ IDEA и для этого вы можете указать базовый пакет для каждого модуля, и он сделает объявления пакета для любого кода в подпакетах, используя две строки автоматически (один для базы и один для остальных). –