这是我对d-ary堆的删除方法。我编译时遇到了很多“不可逆类型”的错误。另请注意,我的程序扩展了Comparable。
public class HeapImpl12<T extends Comparable<? super T>> implements Heap12<T>
我知道我的数组不是类型对象,而是键入T.
T[] _nodeArray = (T[]) new Comparable[DEFAULT_ARRAYSIZE];
问题:我理解一切都应该是T型,但是当我编写代码时,我遇到了很多“CAN NOT CONVERT TYPE T TO TYPE INT”的错误,所以我决定使用类型转换为类型( T)或(整数)。我现在意识到这样做是错误的,因为我得到“不可转换的类型”错误。对Java Generics有深刻理解的人请告诉我保留T类型的所有技巧和技巧。
public void remove(T o) {
for(int i = 0; i < _nodeArray.length; i++){
if(_nodeArray[i].equals(o)){
_nodeArray[i] = _nodeArray[_numNodes - 1];
if((Integer)_nodeArray[i] > parentIdx(i)){
bubbleUp((Integer)_nodeArray[i]);
}
else{
trickleDown((Integer)_nodeArray[i]);
}
}
else{
throw new NoSuchElementException();
}
_numNodes--;
}
}
错误:当我进行类型转换(整数)时发生。如果你想要我,我可以发布我的所有代码,但我认为这已经足够了。
答案 0 :(得分:2)
你真的不需要做太多 - 它实际上是正确的。只需取出明确的演员表并在compareTo
上使用>
:
public void remove(T o) {
for(int i = 0; i < _nodeArray.length; i++){
if(_nodeArray[i].equals(o)){
_nodeArray[i] = _nodeArray[_numNodes - 1];
if(_nodeArray[i].compareTo(parentIdx(i)) > 0){
bubbleUp(_nodeArray[i]);
}
else{
trickleDown(_nodeArray[i]);
}
}
else{
throw new NoSuchElementException();
}
_numNodes--;
}
}