我已经通过以下方式实现了ArrayLinearList类
public class ArrayLinearList<T> implements LinearList<T>, Iterable<T>
其中包含班级成员
protected T[] element
为了扩展该类的功能,我创建了一个新类,该类继承自第一个类
class SuperList<T extends Comparable<T>> extends ArrayLinearList<T>
在这里,我确保类型T实现Comparable接口(无法更改)。
在SuperList类中,我有以下方法
public void replace( int pedro, T maria ){
element[ pedro ] = maria;
}
该方法的行产生以下错误
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Comparable;
但是,如果我以以下方式声明该类,那么我将不再遇到此问题(但是通过这种方式,我将无法再比较类对象)
class SuperList<T> extends ArrayLinearList<T>{
对于解决此问题的任何帮助,我将不胜感激。我不允许修改类\ [ArrayLinearList,而只能修改SuperList类。
提前致谢。
最佳答案
根据异常,您似乎正在用element
初始化new Object[someLength]
并未经检查地强制转换为T[]
。这可能在ArrayLinearList
中发生。问题是在这段代码中:
element[ pedro ] = maria;
element
在运行时被视为Comparable[]
,而Object[]
不是Comparable[]
。现有许多与通用数组创建相关的文章,但是您的问题很有趣,因为您已将继承关系引入混合(缩小类型参数的范围)。最好的解决方案似乎只是与
element
类中的ArrayLinearList
进行交互。将其设置为private
并公开getter和setter。这样可以避免这样的运行时失败(在进行诸如(T[])new Object[someLength]
之类的未经检查的强制转换时需要考虑一些避免的事情)。例如:
public class ArrayLinearList<T> implements LinearList<T>, Iterable<T> {
private final T[] elements;
public ArrayLinearList(final int length) {
@SuppressWarnings("unchecked") // won't be exposed outside this class
final T[] withNarrowedType = (T[])new Object[length];
elements = withNarrowedType;
}
public final void set(final int index, final T element) {
elements[index] = element;
}
}
编辑:我只是注意到您的免责声明“我不允许只修改类
ArrayLinearList
的类SuperList
。”不幸的是,因为ArrayLinearList
的作者编写了类型不安全的代码。但是问题变成了为什么像SuperList.replace
这样的方法需要直接与数组交互(或根本不存在)。看起来好像只是向指定的索引分配了一个新元素-是否没有可用于执行此操作的ArrayLinearList
方法?如果所有其他方法均失败,那么这是最后的解决方法:
((Object[])element)[pedro] = maria;
但这是解决潜在问题的可怕解决方案。