2010-03-15 1 views
210

В Python вы можете сделать:изменить имя импорта в Java или импортировать два класса с тем же именем

from a import b as c 

Как бы вы сделать это в Java, так как у меня есть два импорта, которые сталкивающиеся.

+14

Желаю java сделать это. Приводит к классам с неудобными именами. – fncomp

+0

@fncomp: .. и грязный код с большим количеством полных классов: P – Superole

ответ

284

В Java нет механизма слияния импорта. Вы не можете импортировать два класса с одинаковым именем и использовать оба из них неквалифицированными.

Импорт один класс и использовать полное имя для другого, т.е.

import com.text.Formatter; 

private Formatter textFormatter; 
private com.json.Formatter jsonFormatter; 
+14

Это правильный ответ, и я добавлю только то, что вы подразумевали: нет, в Java нет такого синтаксиса псевдонимов. –

+10

Это еще ограничение в Java 8? – HairOfTheDog

+5

@HairOfTheDog Nope, к сожалению, в Java8 не добавлено сглаживание импорта. – AdrieanKhisbe

15

Java не позволяет сделать это. Вам нужно будет обратиться к одному из классов по его полному имени и только импортировать другое.

32

Это, вероятно, стоит отметить, что Groovy has this feature:

import java.util.Calendar 
import com.example.Calendar as MyCalendar 

MyCalendar myCalendar = new MyCalendar() 
+9

В Scala это: 'import com.example. {Calendar => MyCalendar}' – pablisco

+7

И в Котлине: 'import com.example.Calendar как MyCalendar'. – KevinO

+3

В PHP это: использование com \ example \ Calendar как MyCalendar – matang

30

Как и другие ответы уже говорилось, Java не предоставляет эту функцию.

Выполнение этой функции было запрошено несколько раз, например. как JDK-4194542: class name aliasing или JDK-4214789: Extend import to allow renaming of imported type.

Из комментариев:

Это не необоснованным запрос, хотя вряд ли необходимо. Случайные использование полностью квалифицированных имен не является чрезмерным бременем (если только библиотека действительно повторяет те же простые имена справа и слева, что является плохим стилем).

В любом случае, это не соответствует значению цены/производительности для языка изменить.

Так что я думаю, что мы не увидим эту функцию в Java в ближайшее время :-P

+6

wow! вы не шутили о «не (...) в ближайшее время», я вижу, что запрос функции был отклонен как бессмысленный сахар еще в 1998 году! И каждая попытка вновь открыть дискуссию в течение последних 18 лет застряла на ссылке на это древнее решение. Думаю, было бы проще убедить разработчиков IDE реализовать это как маску в редакторе, чем попытаться опрокинуть смысл в Oracle. – Superole

+0

Старые рассуждения верны, хотя на практике эти столкновения очень редко бывают. – slim

+4

Я не согласен, что эти столкновения редко происходят. Ориентация объекта способствует простому именованию. У меня может быть класс Employee из двух разных библиотек, которые отделяют вещи от сотрудника (например). –

-4

На самом деле можно создать ярлык, так что вы можете использовать более короткие имена в вашем коде, делая что-то вроде этого:

package com.mycompany.installer; 
public abstract class ConfigurationReader { 
    private static class Implementation extends com.mycompany.installer.implementation.ConfigurationReader {} 
    public abstract String getLoaderVirtualClassPath(); 
    public static QueryServiceConfigurationReader getInstance() { 
     return new Implementation(); 
    } 
} 

Таким образом, вам нужно только указать длинное имя один раз, и вы можете иметь столько специально названных классов, которые вы хотите.

Другое, что мне нравится в этом шаблоне, это то, что вы можете назвать класс реализации так же, как абстрактный базовый класс, и просто поместить его в другое пространство имен. Тем не менее это не связано с шаблоном импорта/переименования.

+7

Это очень плохое решение. Он полностью не справляется со статикой, может потребовать постоянных обновлений и не помогает с проблемами де-сериализации (такими как десериализация из xml через jaxb). –

1

Это делает то, что вам нужно?

public class Main {  
    private static final class AB extends a.B {} 
    private static final class BB extends b.B {} 

    public static void main(String[] args) { 
     AB ab = new AB(); 
     BB bb = new BB(); 
    } 
} 
+1

Это может сработать, но это вызовет проблемы, если вы попытаетесь сделать что-либо рефлексивное или попытаетесь создать общедоступный метод, который возвращает один из этих типов. Точки для умения, но умение не всегда является хорошей идеей на практике. –

Смежные вопросы