2

这是一个 Java 分配问题,可能涉及子类型和泛型。我有一个扩展ArrayList名为 Rows的类

public class Rows extends ArrayList<List<Thing>> implements List<List<Thing>>{}

我需要在另一个类中返回它,该类有一个返回 a 的方法List<List<Thing>>,因此我需要这样做以获得所需的返回类型:

private List<List<Thing>> list;

public List<List<Thing>> rows() {
    Rows r = (Rows) list;// But this cast does not work at runtime
    return (List<List<Thing>>) r;
}

Eclipse 返回的错误java.lang.ClassCastException: java.util.ArrayList不能转换为 package.Rows。当我的 Rows 类扩展时,我很困惑,ArrayList我认为它应该能够被转换为它。

4

1 回答 1

1
Rows extends ArrayList<List<Thing>>

上面的定义说这Rows是一个子类ArrayList<List<Thing>>这意味着它是一个专门的版本),而不是RowsArrayList<List<Thing>>.

这意味着 aRows是一种ArrayList<List<Thing>>(所以向上转换有效)但 anArrayList<List<Thing>>不一定是 a Rows(所以向下转换不起作用)。

如果您有一个创建为 a 的对象new ArrayList<List<Thing>>,那么这是它的类型,您不能进一步向下转换它。如果您希望能够将其用作Rows,只需将其创建为new Rows.

(顺便说一下,复数对于类名来说是非常规的。)

于 2013-05-25T10:37:59.330 回答