приоритет импорта класса в scala против java

#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(""))