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 :)
Vielen Dank für Ihre Antwort! Ich musste einfach 'elem.compareTo (node.keys [i])' zu 'node.keys [i] .compareTo (elem)' ändern – Tim