【问题标题】:Errors while using generics, arrays and compareTo()使用泛型、数组和 compareTo() 时出错
【发布时间】:2013-07-07 18:09:16
【问题描述】:

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

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

在我看来,我赢不了。提前感谢您的帮助。

【问题讨论】:

  • 让我们看看你的主要错误发生在哪里
  • 你确定你说的不是&lt;T extends Comparable&lt;T&gt;&gt;,或者最坏的情况是&lt;T extends Comparable&lt;? super T&gt;&gt;
  • @fge 你说得对,我有&lt;T extends Comparable&lt;T&gt;&gt;
  • 为了获得最佳效果,请使用&lt;T extends Comparable&lt;? super T&gt;&gt;

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


【解决方案1】:

是的,这就是问题所在:

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

如果您将其更改为:

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

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

【讨论】:

  • 当我实施您的更改时,我得到java.lang.RuntimeException: not comparable
【解决方案2】:

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

One answer 可能相关。 And another;我认为他们比我解释得更好。

【讨论】:

    猜你喜欢
    • 2015-09-25
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多