这是一道 Java 作业题,可能涉及子类型化和泛型。我有一个扩展 ArrayList
的类称为行
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
我认为它应该能够被转换为它。
最佳答案
Rows extends ArrayList<List<Thing>>
上面的定义说 Rows
是 ArrayList<List<Thing>>
的子类 (这意味着它是一个专门的版本),不是那个Rows
与 ArrayList<List<Thing>>
相同.
这意味着 Rows
是一种 ArrayList<List<Thing>>
(所以向上转换有效)但是 ArrayList<List<Thing>>
不一定是 Rows
(所以向下转换不起作用)。
如果您有一个创建为 new ArrayList<List<Thing>>
的对象,那么这就是它的类型,你不能进一步向下转型。如果您希望能够将其用作 Rows
,您只需将其创建为 new Rows
.
(顺便说一句,复数对于类名来说是非常规的。)
关于java - Java 中的子类型还是泛型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16748649/