我的Java项目中有两个类:
public abstract class Heap<T extends Comparable<T>> {
private Comparable<T> data[];
private int numberOfElements;
public Heap( int size ) {
//I am also not sure if this cast will work or is best practice
data = (Comparable<T>[]) new Comparable<?>[ size + 1 ];
numberOfElements = 0;
}
public void incrementNumberOfElements() { numberOfElements++; }
public int getNumberOfElements() { return numberOfElements; }
public Comparable<T>[] getData() { return data; }
public abstract void insert( Comparable<T> element );
}
class MinHeap<T extends Comparable<T>> extends Heap<T> {
public MinHeap( int size ) { super(size); }
public void insert( Comparable<T> element ) {
incrementNumberOfElements();
Comparable<T> data[] = getData();
int current = getNumberOfElements();
data[ current ] = element;
//The error is with compareTo()
while ( current / 2 >= 1 && data[ current ].compareTo( data[ current / 2 ] ) < 0 ) {
//code
}
}
}
我使用compareTo()方法得到以下编译时错误:The method compareTo(T) in the type Comparable<T> is not applicable for the arguments (Comparable<T>)
。如果我投射这样的数据:data[ current ].compareTo( (T) data[ current / 2 ] )
那么错误就会消失,但是会有警告。
我的问题是:添加演员data[ current ].compareTo( (T) data[ current / 2 ] )
是最好的方法来实现这项工作吗?如果没有,有什么建议可以让它变得更好?我的目标是创建一个可以与任何实现Comparable接口的类一起使用的Heap。
我对使用泛型不太熟悉,所以感谢任何有用的建议。
答案 0 :(得分:2)
public void insert( T element )
- 因为要插入类型为T及以上的元素(class MinHeap<T extends Comparable<T>>
),指定T必须扩展为Comparable。
我已经将代码更改为使用数组列表而不是数组,不确定是否需要使用数组。
import java.util.ArrayList;
import java.util.List;
public abstract class Heap<T extends Comparable<T>> {
private List<T> data;
private int numberOfElements;
public Heap( int size ) {
//I am also not sure if this cast will work or is best practice
data = new ArrayList<T>(size + 1 );
numberOfElements = 0;
}
public void incrementNumberOfElements() { numberOfElements++; }
public int getNumberOfElements() { return numberOfElements; }
public List<T> getData() { return data; }
public abstract void insert( T element );
}
class MinHeap<T extends Comparable<T>> extends Heap<T> {
public MinHeap( int size ) { super(size); }
public void insert( T element ) {
incrementNumberOfElements();
List<T> data = getData();
int current = getNumberOfElements();
data.set(current, element);
//The error is with compareTo()
while ( current / 2 >= 1 && data.get(current).compareTo( data.get(current / 2) ) < 0 ) {
//code
}
}
}
答案 1 :(得分:1)
您的data
应该是T[]
而不是Comparable<T>[]
。这是最有意义的。此外,如果它是T[]
,那么当你得到一个元素时,它是T
,它可以与自身进行比较。但如果它是Comparable<T>
,那并不能保证它可以与自身进行比较。
但你也没有方法T[] getData()
。 1)data
变量是一个内部实现细节,你不应该让外部引用它。 2)如果不知道运行时的组件类型,就不可能创建某个组件类型的数组,而这个组件类型并不在此类中。