1

일반적으로 type 매개 변수를 지정하지 않고 java.lang.Comparable 인터페이스를 구현 한 것처럼 보입니다.왜 <T> 번을 여러 번 구현할 수 없습니까?

public abstract class Area implements Comparable { 
    @Override 
    public int compareTo(Object other) { 
     if (other instanceof Area) 
      return new Double(getArea()).compareTo(other.getArea()); 
     return -1; // or something else 
    } 
    abstract public double getArea(); 
} 

사과와 사과를 비교하기 때문에 유형을 지정하는 것이 타당합니다.

public abstract class Area implements Comparable<Area>, Comparable<Volume> { 
    @Override 
    public int compareTo(Area other) { 
     // ... 
    } 
    @Override 
    public int compareTo(Volume other) { 
     // ... 
    } 
} 

하지만 자바 컴파일러는 나에게 말한다 :

Area.java:2: error: repeated interface 
public abstract class Area implements Comparable<Area>, Comparable<Volume> { 
                   ^
Area.java:2: error: Comparable cannot be inherited with different arguments: <Area> and <Volume> 
  1. 내가 함께 Area을 비교하는 다른 클래스를 소개합니다

    public abstract class Area implements Comparable<Area> { 
        @Override 
        public int compareTo(Area other) { 
         // ... 
    

    는, 나는 다음을 수행 할 수 있다고 생각 제네릭 인터페이스의 형식 인수를 지정하는 데 단점이 있습니까?

  2. Java가이 다중 구현을 허용하지 않는 이유는 무엇입니까?

참고 : 나는 1.7.0_45

+0

더 나은 질문은 왜 이것이 유익 할 것이라고 생각합니까? 그리고'newYork.compareTo (eleven)'이 사과에게 사과가되는 방법은 무엇입니까? :-) – haraldK

답변

4
  1. 이 아니, 일반을 지정하는 단점 아니라 자바 버전을 사용하고 있습니다 - 그것은 실제로 기능입니다. 또한 일반적인 유형을 인스턴스화하거나 일반 배열을 작성할 수 없다는 잘 알려진 사실 이외에 인터페이스에서 제네릭을 사용하는 데 대한 단점을 상기하지 않습니다.하지만 인터페이스 자체가 아니라 구현의 문제입니다.

  2. 이것은 type erasure입니다. Comparable<Area>Comparable<Volume>은 본질적으로 VM에 대해 동일한 클래스이며 컴파일러에 대한 유효성을 확인한 직후입니다. 이 클래스에서 상속보다는 구성을 유지하기 위해 일반적으로 쉽게 -

당신이 두 가지 유사한 인터페이스를 구현 한 단지 그들을 위해 Comparator의를 사용하려는 경우

.

(런타임에 제네릭을 구별하는) 일부 응용 프로그램의 경우 서브 클래스를 사용해보십시오. ComparableArea extends Comparable<Area> & ComparableVolume extends Comparable<Volume>하지만이 경우에는 여전히 IMO를 해결하는 것보다 더 많은 문제가 발생할 것입니다. 이는 여전히 Comparable cannot be inherited with different arguments 오류가 발생하기 때문입니다.하지만 최소한 이러한 인터페이스는 예 : instanceof.

+2

동의합니다. OP가 동일한 유형이 아니고 공통 수퍼 클래스를 공유하지 않는 여러 항목을 비교할 수있게하려면 OP를 수행하는 방법을 알고있는 'Comparator'를 작성하는 것이 좋습니다.여러분의'Area' 클래스는 실제로'Volume' 클래스가 존재하는지, 자신을 비교하는 방법을 알 필요는 없습니다. * 그들이했다면, 당신의'Volume' 클래스도'Comparable'을 구현할 필요가 없을까요? 더 많은 유형을 추가 할 때 이것이 어떻게 통제 불능 상태로 빠져 나가는지를 알 수 있습니다. –

+0

@CraigOtis 전적으로 동의합니다. 나는 그것을 내 대답의 쪽지로 추가 할 것이다. – vaxquis

0

저는이 방법으로 java가 관련 클래스가 Comparable 일 수 있다고 말합니다. 그러나 인위적인 Comparator를 사용하여 관련없는 클래스 사이에 더 많은 비교를 할 수 있습니다. 그래서 우리는 관련 클래스의 일반 인터페이스 (동일한 상속 계층 구조 내의 클래스)를 구현해야합니다. 인위적인 구현을 추가하려면 전달할 수있는 인터페이스를 추가하십시오 (Comparable 및 Comparator와 같은 인터페이스 패밀리 쌍이 있음).