2013-04-25 6 views
4

제네릭 타이핑을 사용하여 이진 트리를 만들려고하는데 이해가되지 않는 오류가 있습니다. 두 가지 코딩 방법을 시도하고 두 번째 방법이 효과가있었습니다. 나는 왜 처음이 실패했는지 이해하지 못한다.자바 - 제네릭 형식

나는 다음과 같은 공통 코드가이 작동 :

public class MyTreea <T extends Comparable<T>> 
{  
    class BT_Node<T extends Comparable<T>> 
      { 
      T   value; 
      BT_Node<T> left; 
      BT_Node<T> right; 

      BT_Node(T node_value) 
        { 
        this.value = node_value ; 
        left   = null; 
        right  = null; 
        } 
      }   

의 차이는 삽입 절차에

private BT_Node<T> insert(BT_Node<T> node, BT_Node<T> newNode) { 
     if ((node.value).compareTo(newNode.value) == 0) { . . . } 

을하지만이 함께

private BT_Node insert(BT_Node node, T value) { 
     if (value.compareTo(node.value) == 0) { . . 

실패 :

MyTreea.java:28: error: method compareTo in interface Comparable<T#2> cannot be applied to given types; 
      if (value.compareTo(node.value) == 0) 
required: T#1 
found: Comparable 
reason: actual argument Comparable cannot be converted to T#1 by method invocation conversion 
where T#1,T#2 are type-variables: 
T#1 extends Comparable<T#1> declared in class MyTreea 
T#2 extends Object declared in interface Comparable 

분명히 두 노드 매개 변수가있는 BT_insert를 호출하면 문제가 없습니다. (그리고 나는 여분의 함수를 만들어서 그것을 처리하도록 코딩하고있다.)하지만 나는 그렇게하지 않는 편이 좋을 것이다.

감사

+0

아마도 네임 스페이스와 Comparable 클래스를 포함하여 전체 파일을 게시 할 수 있습니까? – likeitlikeit

답변

1

BT_Node가, 다시 parametrising없이 T를 사용하는 자사의 T 매개 변수를 제거 할 수 있습니다.

그렇지 않으면 서로 다른 확장 기능을 사용할 수있는 Ts가 필요합니다. 아니오 BT_Node<T>도 있습니다.

3

다음과 같은 서명이 두 번째 예제를 사용할 수 있어야합니다 :

당신이 준 예는 항상 일반적이다, "원시 유형"(일반적인 매개 변수가없는 즉, 제네릭 클래스)를 사용

private BT_Node<T> insert(BT_Node<T> node, T value) 
자바 1.4와의 하위 호환성을 위해서만 틀림없이 존재한다. BT_Node은 제네릭 클래스이므로 항상에 제네릭 매개 변수를 지정해야합니다.

그렇지 않은 경우에는 BT_Node<?>을 전달하는 것과 대략 같았습니다. 노드가 일반 매개 변수 값을 가질 수있었습니다. 따라서 컴파일러는 올바른 형식의 value을 전달할 수 있다고 보장 할 수 없습니다. 예를 들어 첫 번째 인수는 BT_Node<Int> 일 수 있으며 TString입니다. T로 일반 매개 변수를 전달하여

는, 컴파일러는 value의 종류와 노드 의 유형 경기를 할 수 있음을 확인할 수 있습니다.

+0

안녕하세요, 감사합니다. 완벽하게 작동했습니다. – user2318773