2012-06-10 5 views
10

첫 번째 코드와 두 번째 코드의 차이점은 무엇입니까? MaxPQ는 서로 비교할 수있는 "Key"개체의 모음 인 우선 순위 큐를 나타냅니다.은 Java에서 generics로 vs extends를 구현합니다.

코드 1 :

public class MaxPQ<Key extends Comparable<Key>>{ 
... 
} 

코드 2 :

public class MaxPQ<Key implements Comparable<Key>>{ 
... 
} 

이 두 번째 코드는 컴파일되지 않지만, 사용할 때 우리가 대신 구현 인터페이스로 확장 할 필요가 왜 나에게 직관적되지 않습니다 제네릭

+1

[여기] [1]에서 비슷한 질문을 찾을 수 있습니다. [1] : http://stackoverflow.com/questions/976441/java-generics-why-is-extends-t-allowed-but-not-implements-t, 감사입니다 – krakover

답변

10

차이점은 매우 간단합니다. 두 번째 코드 스 니펫은 컴파일되지 않으며 결코 수행되지 않습니다. generics를 사용하면 항상 클래스와 인터페이스 모두에 대해 extends을 사용합니다. 또한 super 키워드를 사용할 수 있지만 의미가 다릅니다.

+0

거기 그 이유? – Popcorn

+0

@ MarkX : 제발 generics가 설계되고 지정되는 방법은 아닙니다. 간단? –

+3

@Mark 한 가지 이유는 'Key'는 인터페이스 자체 일 수 있으며, Comparable이 인터페이스 임에도 불구하고 갑자기 다시 '확장'됩니다. 그래서 모든 경우에 절대적으로 맞을 수는 없기 때문에 일관되게 일치하지 않는 것이 선호되었습니다. – Voo

1

제네릭에는 구현 도구가 없습니다. 두 번째 코드가 유효하지 않습니다. 당신은 아마와 혼동 : 나는 일반적인 클래스 선언의 경우에 어떤 차이를하지 않기 때문에 그것은, 인터페이스 및 클래스 모두 extends을 사용하기로 결정했다 가정

public class MaxPQ implements Comparable<Key> { 
    ... 
} 
0

하는 인터페이스 또는 클래스에 바인딩 형식 인수입니다.

물론 extends의 의미는 클래스 정의의 일반적인 사용법과 완전히 다릅니다. Angelika Langer는 Java에서 extends의 다른 의미에 대한 멋진 텍스트를 가지고 있습니다. Does "extends" always mean "inheritance"?