#java #scala
#java #scala
Вопрос:
Я застрял из-за проблемы с классом импорта. В моем случае мой класс имеет зависимость от Apache Common StringUtils
, и в том же пакете есть класс с тем же именем ( StringUtils
) . (Основной класс имеет зависимость от Apache Common StringUtils
, и в том же пакете с основным классом есть StringUtils. Но это ошибка компиляции)
Я указал apache common StringUtils
с синтаксисом импорта, но, похоже, он затенен тем же пакетом StringUtils
. Это языковая спецификация scala?
В Java проблем нет. Он работает со StringUtils от Apache common.
Комментарии:
1. Пожалуйста, размещайте свой код как код, а не как фотографии кода. Это сайт для программистов, а не фотографов. Мы хотим читать, копировать и вставлять, компилировать, выполнять, тестировать и отлаживать ваш код, а не критиковать его использование перспективы, теней, контраста и цвета. Фотографии кода не могут быть прочитаны слабовидящим человеком, их нельзя искать, их нельзя индексировать, их нельзя цитировать, их нельзя копировать и вставлять, их нельзя компилировать, их нельзя выполнять, их нельзя тестировать, их нельзя отлаживать.
Ответ №1:
Я предлагаю вам просто использовать возможность в scala для создания «псевдонима», например:
import users.{UserPreferences => UPrefs} // import and rename for convenience
(из scala-lang.org )
Другими словами: просто избегайте затенения этого имени класса, импортируя библиотечный класс под другим именем.
Ответ №2:
Вы можете использовать StringUtils от Apache, используя полное имя.
println(org.apache.commons.lang3.StringUtils.isEmpty(""))
Ответ №3:
Это потому, что ваш компилятор использует ближайший класс, который он может найти для представления StringUtils
. Это может быть либо тот, который вы написали в своем коде, либо тот, в org.apache
котором, но кто знает? Вы сами можете даже не быть уверены в какой-то момент! Итак, вы должны это уточнить.
Класс фактически определяется с использованием полного имени пакета, и когда вы выполняете импорт, он позволяет вам использовать только ярлык ie StringUtils
вместо org.apache.commons.lang3.StringUtils
.
Чтобы противостоять этой проблеме, несколько вариантов:
- статический импорт с
import org.apache.commons.lang3.StringUtils._
помощью: здесь вы можете напрямую вызвать методisEmpty
, но компилятор не найдетStringUtils
, скажем - используйте полное имя в вашем вызове:
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
.
Ответ №4:
Другой вариант — импортировать все члены StringUtils
(что-то вроде статического импорта в Java):
org.apache.commons.lang3.StringUtils._
Тогда вы сможете напрямую вызывать метод:
println(isEmpty(""))