source

이름이 같은 두 클래스를 가져오는 중입니다.어떻게 대처해야 할까?

lovecheck 2022. 11. 19. 11:44
반응형

이름이 같은 두 클래스를 가져오는 중입니다.어떻게 대처해야 할까?

예를 들어 다음과 같은 코드가 있습니다.

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 ?

  }
}

제가 정규 학급 이름이어야 하나요?수입 명세서를 삭제할 수 있습니까?이러한 시나리오는 실제 프로그래밍에서 흔히 볼 수 있는 것입니까?

Import 문을 생략하고 경로 전체를 사용하여 참조할 수 있습니다.예:

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

하지만 어떤 것이 어떤 것인지 확실히 알 수 없는 한, 같은 이름의 두 개의 클래스와 유사한 기능을 사용하는 것은 보통 좋은 생각이 아닙니다.

클래스를 가져오는 대신 정규화된 이름을 사용합니다.

예.

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

예, 동일한 단순 이름으로 클래스를 가져오는 경우 정규화된 클래스 이름으로 클래스를 참조해야 합니다.Import 명세서는 다른 개발자가 파일을 작업할 때 파일에 무엇이 있는지 알 수 있기 때문에 그대로 둡니다.

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

또 다른 방법은 서브클래스입니다.

package my.own;

public class FQNDate extends Date {

}

그리고 my.own을 Import합니다.java.util이 있는 패키지의 FQNDate.날짜.

독자적인 날짜 클래스가 있는 경우, 빌트인 날짜 클래스와 구별해야 합니다.즉, 자신의 날짜 클래스를 만든 이유는 무엇입니까?UnmutableDate, BetterDate, NanoDate 등 MyDate에서도 자신의 날짜 클래스가 있는 이유를 알 수 있습니다.이 경우 이들은 고유한 이름을 갖게 됩니다.

Import를 사용하여 이들 중 하나를 Import할 수 있습니다.기타 유사한 클래스의 경우 Fully Qualified 클래스 이름을 지정해야 합니다.그렇지 않으면 컴파일 오류가 발생합니다.

예:

import java.util.Date;

class Test{

  public static void main(String [] args){

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

    // util.Date
    Date utilDate;
  }
}

두 개의 다른 패키지에서 동일한 클래스 이름을 사용하는 경우 다음 두 가지 옵션이 있습니다.

1 Import에 사용할 클래스 이름을 선택하고 다른 클래스 이름을 사용합니다.

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

  }
}

이 시나리오는 실제 프로그래밍에서 그리 흔하지는 않지만, 그리 이상한 것도 아닙니다.다른 패키지에 포함된 두 클래스의 이름이 같을 수 있으며 둘 다 필요합니다.

두 클래스의 이름이 같은 경우 두 클래스 모두 동일한 기능을 포함하므로 둘 중 하나만 선택해야 합니다.

만약 둘 다 필요하다면, 그것을 사용해도 나쁠 것은 없습니다.그것도 나쁘지 않은 프로그래밍 아이디어입니다.

단, 어떤 클래스를 참조하고 있는지를 명확하게 하기 위해 (같은 이름을 가진) 클래스의 완전 수식 이름을 사용해야 합니다.

:)

예를 들어, 한 클래스를 다른 클래스에 매핑할 때(예: 개인 데이터를 나타내기 위해 새 클래스 세트로 전환하는 경우) 이 문제가 발생합니다.이 시점에서 두 클래스가 모두 필요합니다.이것이 코드의 포인트이기 때문입니다.한 클래스를 다른 클래스에 매핑하는 것입니다.또, 어느 장소에서도 클래스의 이름을 변경할 수 없습니다(이것도, 다른 사람이 한 것을 변경하는 것이 아니라, 매핑하는 것입니다).

완전 자격증도 한 가지 방법입니다.예를 들어 Java는 어떤 "개인"이 의미하는지 걱정하기 때문에 실제로 두 가져오기 문을 모두 포함할 수 없습니다.

같은 이름의 클래스를 호출할 경우 클래스를 호출할 패키지를 명시적으로 지정해야 합니다.

다음과 같이 할 수 있습니다.

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}

같은 문제가 있었습니다만, 라이브러리 순서를 정렬했습니다.예를 들어 java.lang이 있었습니다.특수한 포인터예외 및 javacard.lang.특수한 포인터예외.첫 번째 클래스는 기본 라이브러리로 만들었으며, 다른 하나를 사용해야 하는 경우 풀 수식 클래스 이름을 명시적으로 지정할 수 있습니다.

언급URL : https://stackoverflow.com/questions/2079823/importing-two-classes-with-same-name-how-to-handle

반응형