使用泛型,数组和compareTo()时的错误

时间:2013-07-07 18:09:16

标签: java generics compiler-errors compare runtime-error

我正在尝试编写通用容器,我必须使用数组。我收到以下错误:

Exception in thread "main" java.lang.ClassCastException: 
[Ljava.lang.Object; cannot be cast to [Ljava.lang.Comparable;

以下是我的代码的一部分:

class MinFo<T extends Comparable> {

private final T[] array;

MinFo(int size){
array = (T[]) new Object[size];

}

T get(){

if(this instanceof Comparable){

int tmpPos = getNotNull();
T tmp = array[tmpPos];
int pos;    
for(pos = tmpPos ; pos < array.length; getNotNull()){

    if(tmp.compareTo(array[pos]) > 0)
    tmp = array[pos];
}

这导致我从类声明中删除了“extends Comparable”。现在我有一个不同的错误:

error: cannot find symbol
    if(tmp.compareTo(array[pos]) > 0)
          ^
symbol:   method compareTo(T)
location: variable tmp of type T
where T is a type-variable:
 T extends Object declared in class MinFo

在我看来,我无法获胜。在此先感谢您的帮助。

2 个答案:

答案 0 :(得分:5)

是的,这就是问题所在:

array = (T[]) new Object[size];

如果您将其更改为:

array = (T[]) new Comparable[size];

然后应该没问题。问题是,T[]的强制转换只是(在执行时)转换为Comparable[],因为T的上限是Comparable

答案 1 :(得分:0)

Object实际上并没有实现Comparable,因此声明不起作用。

可能相关的

One answerAnd another;我认为他们比我能更好地解释它。