импортировать приоритет класса в Scala против Java - PullRequest
2 голосов
/ 12 апреля 2019

Я застрял из-за проблемы класса импорта. В моем случае мой класс зависит от Apache Common StringUtils, и в том же пакете есть один и тот же класс имен (StringUtils). (Основной класс имеет зависимость от StringUtils Apache Common, и в том же пакете с классом Main есть StringUtils. Но это ошибка компиляции)

enter image description here

Я указал StringUtils общего Apache Common с синтаксисом импорта, но он, кажется, затенен тем же пакетом StringUtils. Это спецификация языка scala?

В Java проблем нет. Он работает с StringUtils Apache common. enter image description here

Ответы [ 4 ]

7 голосов
/ 12 апреля 2019

Я предлагаю вам просто использовать возможность в Scala для создания «псевдонима», например:

import users.{UserPreferences => UPrefs}  // import and rename for convenience

(из scala-lang.org )

Другими словами: просто избегайте затенения имени этого класса, импортируя класс библиотеки под другим именем.

6 голосов
/ 12 апреля 2019

Вы можете использовать Apache StringUtils, используя полное имя.

println(org.apache.commons.lang3.StringUtils.isEmpty(""))
3 голосов
/ 12 апреля 2019

Это потому, что ваш компилятор использует ближайший класс, который он может найти для представления StringUtils.Это может быть или , который вы написали в своем коде, или тот, который org.apache, но кто знает?Вы сами, возможно, даже не уверены в какой-то момент!Таким образом, вы должны уточнить, что.

Класс фактически определяется с использованием полного имени пакета, и когда вы выполняете импорт, он позволяет вам использовать только ярлык , то есть StringUtils вместо org.apache.commons.lang3.StringUtils.

Чтобы противостоять этой проблеме, есть несколько опций:

  • статический импорт с import org.apache.commons.lang3.StringUtils._: здесь вы можете напрямую вызвать метод isEmpty, но компилятор не найдетStringUtils per say
  • используйте полное имя в своем вызове: println(org.apache.commons.lang3.StringUtils.isEmpty(...)) Таким образом, невозможно путаница
  • в Scala у вас есть возможность определять аллиасы.Для этого у вас есть два варианта.Либо во время импорта: import org.apache.commons.lang3.{StringUtils => ApacheStringUtils}, либо в вашем классе: type ApacheStringUtils = org.apache.commons.lang3.StringUtils.Для такого рода случаев опция «во время импорта» немного удобнее и, возможно, даже более эффективна (вы можете заменить тип, который вы определили в своем коде во время выполнения).

Я бы лично предпочел вариант3.1 (когда вы создаете псевдоним во время импорта).Таким образом, ваш код более понятен, и вы можете вызывать любую функцию с StringUtils.

2 голосов
/ 12 апреля 2019

Другой вариант - импортировать все элементы StringUtils (что-то вроде статического импорта в Java):

org.apache.commons.lang3.StringUtils._

Тогда вы сможете напрямую вызывать метод:

println(isEmpty(""))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...