java - Java 中的子类型还是泛型?

标签 java generics subtyping

这是一道 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>>

上面的定义说 RowsArrayList<List<Thing>>子类 (这意味着它是一个专门的版本),不是那个RowsArrayList<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/

相关文章:

java - 在 Facebook 身份验证的对话框参数中删除 display=wap 对话框的替代解决方案是什么?

java - 流损坏异常 - 无效代码类型 AC [java]

c# - 不带日期时间函数(如 ToShortDateString())的 DateTime 等类型的隐式运算符

java - 对具有泛型参数的 java 接口(interface)方法使用特定的实现类型。如何避免不加控制的 Actor 阵容

java - 我们可以用 Java(或 Kotlin)表示 "self class"吗?

rust - 在子类型上获取 Rc<RefCell<dyn T>>>

java - 客户端/服务器套接字 Java(模式 MVC)未向客户端发送正确的信息

java - 如何计算2个Unix timeSpan差异。例如int结束时间=1213036458; int开始时间= 1211018446;

java - 迭代器泛型,无法声明不匹配类型的迭代器(可能是转换问题)

c++ - std::any 是否使用类型删除、子类型化或多态性?