Java中的子类型或泛型?

时间:2013-05-25 10:29:28

标签: java generics subtyping

这是一个Java Assignment问题,可能涉及子类型和泛型。我有一个扩展ArrayList的类叫做Rows

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

我需要在另一个具有返回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,我认为它应该能够被投射到它。

1 个答案:

答案 0 :(得分:1)

Rows extends ArrayList<List<Thing>>

上面的定义说RowsArrayList<List<Thing>>子类(这意味着它是一个专门的版本),不是 {{1与Rows相同。

这意味着ArrayList<List<Thing>>是一种Rows(所以向上转播有效),但ArrayList<List<Thing>>不一定是ArrayList<List<Thing>>(因此向下转换不起作用)

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

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