Java, есть ли способ, которым мы можем импортировать класс под другим именем - PullRequest
38 голосов
/ 24 апреля 2011

есть ли способ, которым мы можем импортировать класс под другим именем?Например, если у меня есть класс с именем javax.C и другой класс с именем java.C, я могу импортировать javax.C под именем C1 и импортировать java.C под именем C2.

.C #:

using Sys=System;

или Vb:

Imports Sys=System

Ответы [ 4 ]

43 голосов
/ 24 апреля 2011

Нет, в Java ничего подобного нет. Вы можете импортировать классы только под их исходным именем и использовать полное имя для всего, что вы не импортируете (кроме тех, которые указаны в java.lang и пакете текущего класса).

4 голосов
/ 24 апреля 2011

Короче, нет, в Java это невозможно.

2 голосов
/ 24 апреля 2011

Нет. Я думаю, что Java сознательно отказалась от typedef. Хорошей новостью является то, что если вы видите тип, вы знаете, что это такое. Это не может быть псевдонимом для чего-то другого; или псевдоним к псевдониму ...

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

Пример использования Sys=System будет недоволен большинством разработчиков Java.

1 голос
/ 02 января 2017

Java не поддерживает статическое переименование. Одна идея состоит в том, чтобы создать подкласс рассматриваемого объекта с новым именем класса (но это может не быть хорошей идеей из-за определенных побочных эффектов / ограничений, например, у вашего целевого класса может быть модификатор final. Где разрешено, код может вести себя по-разному, если явная проверка типа используется getClass() или instanceof ClassToRename и т. д. (пример ниже адаптирован из другого ответа)

class MyApp {

  public static void main(String[] args) {
    ClassToRename parent_obj = new ClassToRename("Original class");
    MyRenamedClass extended_obj_class_renamed = new MyRenamedClass("lol, the class was renamed");
    // these two calls may be treated as the same
    // * under certain conditions only *
    parent_obj.originalFoo();
    extended_obj_class_renamed.originalFoo();
  }  

  private static class ClassToRename {
    public ClassToRename(String strvar) {/*...*/}
    public void originalFoo() {/*...*/}
  }

  private static class MyRenamedClass extends ClassToRename {
    public MyRenamedClass(String strvar) {super(strvar);}
  }

}
...