Импорт двух классов с одинаковыми именами. Как справиться? - PullRequest
101 голосов
/ 17 января 2010

Скажи, что у меня есть такой код:

import java.util.Date;
import my.own.Date;

class Test{

  public static void main(String [] args){

    // I want to choose my.own.Date here. How?
    ..
    // I want to choose util.Date here. How ?

  }
}

Должны ли я быть полными квалифицированными именами классов? Могу ли я избавиться от операторов импорта? Распространен ли такой сценарий в программировании в реальном мире?

Ответы [ 11 ]

138 голосов
/ 17 января 2010

Вы можете опустить операторы импорта и ссылаться на них, используя весь путь. Например:

java.util.Date javaDate = new java.util.Date()
my.own.Date myDate = new my.own.Date();

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

20 голосов
/ 17 января 2010

используйте полное имя вместо импорта класса.

, например

//import java.util.Date; //delete this
//import my.own.Date;

class Test{

   public static void main(String [] args){

      // I want to choose my.own.Date here. How?
      my.own.Date myDate = new my.own.Date();

      // I want to choose util.Date here. How ?
      java.util.Date javaDate = new java.util.Date();
   }
}
8 голосов
/ 25 августа 2011

Еще один способ сделать это подкласс:

package my.own;

public class FQNDate extends Date {

}

А затем импортируйте my.own.FQNDate в пакеты с java.util.Date.

8 голосов
/ 17 января 2010

Да, когда вы импортируете классы с одинаковыми простыми именами, вы должны ссылаться на них по их полностью определенным именам классов.Я бы оставил операторы импорта, так как это дает другим разработчикам ощущение того, что находится в файле, когда они работают с ним.

java.util.Data date1 = new java.util.Date();
my.own.Date date2 = new my.own.Date();
3 голосов
/ 28 февраля 2016

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

Например:

import java.util.Date;

class Test{

  public static void main(String [] args){

    // your own date
    my.own.Date myOwndate ;

    // util.Date
    Date utilDate;
  }
}
3 голосов
/ 17 января 2010

Если у вас есть свой собственный класс дат, вы должны отличать его от встроенного класса Date. то есть, почему вы создали свой собственный. Что-то вроде ImmutableDate или BetterDate или NanoDate, даже MyDate будет указывать, почему у вас есть свой собственный класс дат. В этом случае они будут иметь уникальное имя.

2 голосов
/ 07 октября 2017

Если вы действительно хотите или хотите использовать одно и то же имя класса из двух разных пакетов, у вас есть два варианта:

1 выберите один для использования в импорте и используйте полное имя другого класса:

import my.own.Date;

class Test{

     public static void main(String[] args){

        // I want to choose my.own.Date here. How?
        //Answer:
        Date ownDate = new Date();

        // I want to choose util.Date here. How ?
        //Answer:
        java.util.Date utilDate = new java.util.Date();

     }
}


2 - всегда используйте полное имя класса:

//no Date import
class Test{

  public static void main(String[] args){

    // I want to choose my.own.Date here. How?
    //Answer:
     my.own.Date ownDate = new my.own.Date();
    // I want to choose util.Date here. How ?
    //Answer:
     java.util.Date utilDate = new java.util.Date();

  }
}
2 голосов
/ 13 апреля 2013

Я столкнулся с этой проблемой, например, при сопоставлении одного класса с другим (например, при переключении на новый набор классов для представления персональных данных). В этот момент вам нужны оба класса, потому что в этом весь смысл кода - сопоставить один с другим. И вы не можете переименовать классы ни в одном месте (опять же, задача состоит в том, чтобы отобразить, а не изменить то, что сделал кто-то другой).

Полностью квалифицированным является один из способов. Похоже, вы не можете на самом деле включить оба оператора импорта, потому что Java беспокоится о том, что означает, например, «Персона».

2 голосов
/ 17 января 2010

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

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

Если нам нужны оба варианта, то использование этого не принесет вреда. И это тоже неплохая идея программирования.

Но мы должны использовать полностью определенные имена классов (которые имеют одинаковые имена), чтобы было ясно, на какой класс мы ссылаемся.

:)

0 голосов
/ 28 октября 2018

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

Вы можете сделать так:

import first.Foo;

public class Main {
    public static void main(String[] args) {
        System.out.println(new Foo());
        System.out.println(new second.Foo());
    }
}



package first;

public class Foo {
    public Foo() {
    }

    @Override
    public String toString() {
        return "Foo{first class}";
    }
}



package second;

public class Foo {
    public Foo() {
    }

    @Override
    public String toString() {
        return "Foo{second class}";
    }
}

Выход:

Foo{first class}
Foo{second class}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...