Импортирование двух классов с одинаковым именем. Как обращаться?

Скажем, у меня есть код вроде:

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 ?

  }
}

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

Ответ 1

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

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

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

Ответ 2

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

например.

//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();
   }
}

Ответ 3

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

java.util.Data date1 = new java.util.Date();
my.own.Date date2 = new my.own.Date();

Ответ 4

Другой способ сделать это - подкласс it:

package my.own;

public class FQNDate extends Date {

}

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

Ответ 5

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

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

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

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

:)

Ответ 6

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

Ответ 7

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

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

Ответ 8

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

Например:

import java.util.Date;

class Test{

  public static void main(String [] args){

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

    // util.Date
    Date utilDate;
  }
}

Ответ 9

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

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();

  }
}

Ответ 10

У меня была такая же проблема, что и я, я упорядочил порядок библиотеки, например, были java.lang.NullPointerException и javacard.lang.NullPointerException. Я сделал первый в качестве библиотеки по умолчанию, и если вам нужно использовать другое, вы можете явно указать полное имя класса.