2010-05-06 3 views
2

클래스 지정을 위해 bultin 유형의 언어를 사용할 수 없으므로 내 목록이 붙어 있습니다. 어쨌든, 여기 상황이다 : 그러나Java가 Generic에서 내 LinkedList를 허용하지 않는 이유는 무엇입니까?

public class CrazyStructure <T extends Comparable<? super T>> { 
    MyLinkedList<MyTree<T>> trees; //error: type parameter MyTree is not within its bound 
} 

:

public class CrazyStructure <T extends Comparable<? super T>> { 
    LinkedList<MyTree<T>> trees; 
} 

작품. MyTree는 Comparable 인터페이스를 구현하지만 MyLinkedList는 구현하지 않습니다. 그러나 Java의 LinkedList는 this에 따라이 중 하나를 구현하지 않습니다. 그래서 문제는 무엇이며 어떻게 고칠 수 있습니까?

MyLinkedList :

public class MyLinkedList<T extends Comparable<? super T>> { 
    private class Node<T> { 
     private Node<T> next; 
     private T data; 

     protected Node(); 
     protected Node(final T value); 
    } 

    Node<T> firstNode; 

    public MyLinkedList(); 
    public MyLinkedList(T value); 

    //calls node1.value.compareTo(node2.value) 
    private int compareElements(final Node<T> node1, final Node<T> node2); 

    public void insert(T value); 
    public void remove(T value); 
} 

으로 myTree :

public class LeftistTree<T extends Comparable<? super T>> 
     implements Comparable { 

    private class Node<T> { 
     private Node<T> left, right; 
     private T data; 
     private int dist; 

     protected Node(); 
     protected Node(final T value); 
    } 

    private Node<T> root; 

    public LeftistTree(); 
    public LeftistTree(final T value); 
    public Node getRoot(); 

    //calls node1.value.compareTo(node2.value) 
    private int compareElements(final Node node1, final Node node2); 

    private Node<T> merge(Node node1, Node node2); 
    public void insert(final T value); 
    public T extractMin(); 
    public int compareTo(final Object param); 
} 
+0

'MyLinkedList' 정의를 볼 수 있습니까? – OscarRyz

+6

MyLinkedList 및 MyTree 선언을 더 잘 보여줍니다. – bmargulies

+0

서명 방법을 편집했습니다. 원하는 경우 나머지를 게시 할 수 있습니다. –

답변

5

나는 당신으로 myTree가 LeftistTree과 동일 가정합니다. 서명 문제는 Comparable<LeftistTree<? super T>>을 구현하지 않는다는 것입니다.

그래서 서명이 있어야한다 :

public class LeftistTree<T extends Comparable<? super T>> 
    implements Comparable<LeftistTree<? super T>> 

이유는 MyLinkedList 정기적 LinkedList의처럼되지 않는 것입니다. 일반 LinkedList 유형은 LinkedList<T>입니다. T에 경계가 없습니다. MyLinkedList를 사용하면 매개 변수 자체 또는 해당 수퍼 클래스의 Comparable을 구현해야하지만 사실 LeftistTree는 Raw Comparable (또는 Comparable<?>)을 구현하므로 Comparable은 그 타입에 관련 지을 수있는 것은 아닙니다.

0

연결된 목록에 Comparable을 입력해야하는 이유는 무엇입니까?

컬렉션 데이터 구조의 경우 특정 데이터 형식 만 수락하도록 컬렉션을 강제하는 것은 매우 제한적입니다. 정렬 된 연결 목록을 원할 경우 어떤 요소라도 허용하고 연결된 목록에 Comparator 개체를 허용하는 것이 좋습니다. Comparator을 제공하지 않으면 Comparable이 입력 된 경우 포함 된 요소의 자연 순서에 의존 할 수 있습니다.

예를 들어 SortedSet 또는 SortedMap api 서명을 살펴보십시오.

관련 문제