2012-04-07 9 views
1

Ich erstelle eine generische Mehrweg-Struktur, die ich kenne nur einen von vier Typen (Integer, Double, String und Character). Ich habe Probleme mit der vergleichbaren Schnittstelle und meiner Einfügefunktion. Hier ist der relevante Code, den ich geschrieben habe, so weit:Multiway Baum vergleichbare Schnittstelle Problem

public class BTree<T extends Comparable<? super T>> 
{ 
    private int m=0, height=0, numkeys=0; 
    private BTreeNode<T> root; 
    boolean ready=false; 

class BTreeNode<T extends Comparable<? super T>> 
{ 
    boolean leaf = true; 
    int keyTally = 1; 
    Comparable<T> keys[] = new Comparable[m-1]; 
    BTreeNode<T> references[] = new BTreeNode[m]; 
    BTreeNode(T key) 
    { 
     keys[0] = (Comparable<T>) key; 
     for (int i=0; i<m; i++) 
      references[i] = null; 
    } 
} 

public BTree(int c) 
{ 
    root=null; 
    m=c; 
} 

// Not finished - can't test due to other bug 
public boolean insertElement(T elem) 
{ 
    insert(elem, root, height); 
    numkeys++; 
    return true; 
} 

// And now the ploblem function 

private BTreeNode<T> insert(T elem, BTreeNode<T> node, int hvar) 
{ 
    int i; 

    BTreeNode<T> temp = null; 

    if (hvar == 0) 
    { 
     for (i = 0; i < node.keyTally; i++) 
      if (elem.compareTo(node.keys[i]) < 0) 
       break; 
    } 
    else 
    { 
     for (i = 0; i < node.keyTally; i++) 
     { 
      if ((i+1 == node.keyTally) || elem.compareTo(node.keys[i]) < 0) 
      { 
       Node n = insert(elem, node.references[i++], hvar-1); 
       if (n == null) 
        return null; 

       temp.keys[0] = n.keys[0]; 
       temp.references[0] = n; 
       break; 
      } 
     } 
    } 

    for (int j = node.keyTally; j > i; j--) 
     node.keys[j] = node.keys[j-1]; 
    node.children[i] = temp; 
    node.keyTally++; 
    if (node.keyTally < m) 
     return null; 
    else 
    { 
     BTreeNode<T> newNode = null; 
     newNode.keyTally = m/2; 
     for(i=0; i<m/2; i++) 
     newNode.references[i] = node.references[m/2+i]; 
     return newNode; 
    } 
    return null; 
} 

Und hier ist meine Konsolenausgabe:

BTree.java:169: error: method compareTo in interface Comparable<T#2> cannot be applied 
to given types; 
if (elem.compareTo(node.keys[i]) < 0) 
     ^
required: CAP#1 
found: Comparable<T#1> 
reason: actual argument Comparable<T#1> cannot be converted to CAP#1 by method 
invocation conversion 
where T#1,T#2 are type-variables: 
T#1 extends Comparable<? super T#1> declared in class BTree 
T#2 extends Object declared in interface Comparable 
where CAP#1 is a fresh type-variable: 
CAP#1 extends Object super: T#1 from capture of ? super T#1 

BTree.java:176: error: method compareTo in interface Comparable<T#2> cannot be 
applied to given types; 
if ((i+1 == node.keyTally) || elem.compareTo(node.keys[i]) < 0) 
           ^
required: CAP#1 
found: Comparable<T#1> 
reason: actual argument Comparable<T#1> cannot be converted to CAP#1 by 
method invocation conversion 
where T#1,T#2 are type-variables: 
T#1 extends Comparable<? super T#1> declared in class BTree 
T#2 extends Object declared in interface Comparable 
where CAP#1 is a fresh type-variable: 
CAP#1 extends Object super: T#1 from capture of ? super T#1 

BTree.java:178: error: cannot find symbol 
Node n = insert(elem, node.references[i++], hvar-1); 
^ 
symbol: class Node 
location: class BTree<T> 
where T is a type-variable: 
T extends Comparable<? super T> declared in class BTree 

BTree.java:191: error: cannot find symbol 
node.children[i] = temp; 
    ^
symbol: variable children 
location: variable node of type BTree<T>.BTreeNode<T> 
where T is a type-variable: 
T extends Comparable<? super T> declared in class BTree 

Note: Some input files use unchecked or unsafe operations. 
Note: Recompile with -Xlint:unchecked for details. 
4 errors 

Ich verstehe nicht, was ich tue, falsch mit dem vergleichbaren Schnittstelle zu machen, klagen über die compareTo-Methode. Außerdem habe ich mich gefragt, was es tun wird, wenn der String-Typ verwendet wird? Ich nehme an, es wird nur alphabetisch gesehen, welcher zuerst kommt. Danke :)

Antwort

1

Dies ist, weil node.keys[i] vom Typ Comparable<T> ist, nicht T. Versuchen Sie den Vergleich umgekehrt.

+0

Vielen Dank für Ihre Antwort! Ich musste einfach 'elem.compareTo (node.keys [i])' zu 'node.keys [i] .compareTo (elem)' ändern – Tim

1

Ich würde vorschlagen, dass Sie entweder die Art der keys von Comparable<T>[] zu T[] ändern (denn das ist, was Sie wollen, dass es so verwenden, müssen Sie nur noch nie vorsichtig sein, es von der Klasse nach außen zurück); oder Sie können jedes Mal manuell auf T umwandeln, wenn Sie etwas daraus erhalten: (T)node.keys[i]

Verwandte Themen