Изменение имени импорта в Java или импорт двух классов с одинаковым именем
Проблема с импортом в Java
В Python можно использовать следующий синтаксис для импорта:
from a import b as c
Однако в Java у меня возникли трудности с импортом двух классов, так как их имена конфликтуют. Как я могу решить эту проблему и импортировать классы таким образом, чтобы избежать конфликта имен?
5 ответ(ов)
В Java нет механизма создания псевдонимов для импортов. Вы не можете импортировать два класса с одинаковым именем и использовать оба без указания полного пути.
Импортируйте один класс и используйте полное имя другого, например:
import com.text.Formatter;
private Formatter textFormatter;
private com.json.Formatter jsonFormatter;
Сегодня я подал черновик JEP для OpenJDK, посвящённый этой функции алиасинга. Надеюсь, они смогут её пересмотреть.
Если вас это интересует, вы можете найти черновик JEP здесь: https://gist.github.com/cardil/b29a81efd64a09585076fe00e3d34de7.
В Java это невозможно сделать. Вам нужно будет использовать полностью квалифицированное имя одного из классов, а для другого класса можно сделать импорт.
Это действительно странно, что в Java пока нет подобной функциональности. В Scala это реализовано достаточно легко. В вашем примере вы используете алиасы для импорта классов, что позволяет избежать конфликтов имен и делает код более читаемым.
В Java вы можете использовать полные имена классов, чтобы обойтись без алиасов, но это может привести к довольно "нагруженному" коду. Например:
import com.text.Formatter;
import com.json.Formatter as JsonFormatter; // этого в Java пока нет
Formatter textFormatter = new Formatter();
JsonFormatter jsonFormatter = new JsonFormatter(); // здесь потребуется полное имя класса
Здесь видно, что в Java есть определенные ограничения, которые делают работу с импортами менее гибкой по сравнению со Scala. Это одна из причин, по которой многие разработчики рассматривают возможность перехода на языки с более современными возможностями.
Если нет проблем с конструкторами, отличными от стандартных, вы всегда можете сделать так (все мы ждем, когда спецификация языка Java обновится):
public class YaddaYadda
{
private static class ZU extends eu.zrbj.util.ZrbjUtil_3_0 { }
public void foo (String s)
{
if (ZU.isNullOrEmpty(s))
{
// ...
Для использования в проекте класс с 'import' можно разместить в отдельном файле, что обеспечит единое место определения для импорта.
Это, безусловно, спасает, особенно в отношении классов 'библиотеки', т.е. коллекций статических утилитарных функций. Во-первых, это дает возможность версионировать эти классы — как показано в примере — без значительных неудобств для пользователя.
Почему использование подстановочного знака в операторе импорта Java считается плохой практикой?
Почему нет ConcurrentHashSet, если есть ConcurrentHashMap?
Как объявить массив в одну строку?
Загрузка JDK Java на Linux через wget приводит к отображению страницы лицензии вместо установки
Создание репозитория Spring без сущности