2010-01-14 2 views
6

난 그냥 나무까지 배우고 그것에 대해 이해하지 못하는 한 가지 클래스 선언입니다 : 예를 들어이 클래스 선언은 Java에서 무엇을 의미합니까?

: 클래스 BinarySearchTree<T extends Comparable<? super T>>.

이제 브래킷과 "<? super T>"이 무엇인지 설명해 주시겠습니까?

나를 추천할만한 자료가 있습니까? 감사.

답변

15

이 자바 일반에 대한 좋은 소스입니다. 이진 검색 트리에서는 두 항목을 비교할 수 있어야하므로 컴파일러에서 확인할 수 있도록 지정해야합니다. 꺽쇠 괄호 안에

부품이 타입 파라미터 T 말한다 그것의 제한이다 T 뭐든

  • 을 그 Comparable (<T extends Comparable<...>>)을 연장한다.
  • 상기 ComparableT 또는 수퍼 클래스 T (<? super T>)과 비교할 수 있어야합니다.

일반적으로 T은 무엇이든 될 수 있으므로 검색 트리를 구현하는 것이 바람직한 유형을 선택하는 데 제약이 있습니다.

0

Sun의 Tutorial은 와일드 카드 및 제네릭에 대해 배우기에 좋은 장소입니다.

Java Ranch도 Java "Greenhorns"에 적합합니다.

1

<> 대괄호는 generics라고하는 것입니다. 이것은 C++의 템플릿과 비슷하며 강하게 입력 할 수있는 단일 데이터 구조를 만들 수 있습니다. 당신은 당신이 위의 표기에 사용하는 제네릭의 사용을 만드는 구조를 정의 할 때

ArrayList<String> - an ArrayList containing Strings 
ArrayList<MyClass> - an ArrayList containing MyClass objects 

예를 들어, ArrayList에 객체는 ArrayList의에있는 항목의 유형을 정의하는 일반적인를 사용합니다. "T"는 클래스가 인스턴스화되고 유형이 제공 될 때 채워지는 일부 클래스의 자리 표시 자입니다. 예를 들어, ArrayList에의 정의는 다음과 같이 보일 수 있습니다

public class ArrayList<T> ... 

가장 간단한 방법은 단순히 MyGeneric<T>를 사용하고 모든 클래스를 사용할 수 있도록하는 것입니다. 그러나 때로는 gereric을 특정 상속 구조의 클래스와 함께 사용하기 만하면됩니다. 이 특정 경우에 Comparable<? super T>은 T와 일치하거나 T의 수퍼 클래스 인 모든 유형의 객체를 비교하여 Comparable을 확장하는 객체가 될 것임을 의미합니다.

+0

이것은 또한 유용한 asnwer 감사합니다 – gingergeek

0

문구 <? super T>은 와일드 카드이며, 클래스 BinarySearchTree이 걸릴 수 있음을 의미한다 :
가. 확장 가능한 유형 매개 변수 (T)
b. 또한 는 대등 및 서브 타입을 구현하는 부모가 대등 연장

구조체 <? super T> 클래스 유형 (들) BinarySearchTree의 유틸리티를 연장하는 서브 타입 (S)를 가지고있다. 위의 선언 잘 작동 Helper<Animal> x = new Helper<Animal>() 설명과

// Below declaration of Helper class doesn't uses the wildcard super 
class Helper<T extends Comparable<T>> { 
    // some helper methods 
} 

abstract class Animal implements Comparable<Animal> { 
    public int compareTo(final Animal o) { 
     // implementation ...   
    } 
    // other abstract methods 
} 

class Mammal extends Animal { 
    // implement abstract methods 
} 

: 코드 아래

이 방법을 보여줍니다.
그러나 문 : Helper<Mammal> x = new Helper<Mammal>()가 결합 된
내에서 컴파일 오류를
형식 매개 변수의 포유 동물을하지 않는 제공 (컴파일러 버전은 javac의입니다 1.5.0_06) 클래스 도우미의 선언 아래로 변경

형식 :

class Helper<T extends Comparable<? super T>> { 
    // some helper methods 
} 

문 은 컴파일러 오류를주지 않습니다.

따라서 와일드 카드 사용은 클래스의 유틸리티를 최대화합니다.