【发布时间】:2020-12-16 13:35:50
【问题描述】:
背景:
我有两个类 Book 和 Video 和一个 Driver 类来保存 Book 和 Video 对象的列表,以便拥有一个虚拟库。每个类都有一个方法getTitle(),它从类构造函数的第一个参数返回给定的标题作为String。此外,Driver 类有一个方法getList(),它以List<Object> 的形式返回列表(在此上下文中为lib)
相关片段:
List<Object> lib = new ArrayList<Object>();
// Params for each constructor is a single string for the title for this example
Book b = new Book("Book");
Video v = new Video("Video");
lib.add(b);
lib.add(v);
所以,假设我运行类似:
for (int x = 0; x < lib.size(); x++) {
System.out.println(getList().get(x).getClass());
}
程序将返回
class Book
class Video
但是,如果我从 Book 或 Video 类调用一个方法(相同的方法名称):
for (int x = 0; x < lib.size(); x++) {
System.out.println(getList().get(x).getTitle());
}
我收到以下错误:
java: cannot find symbol
symbol: method getTitle()
location: class java.lang.Object
所以我的问题最终是,
如果 getTitle() 方法不在 Object 类中,我如何从对象列表中的元素调用 getTitle()?如果我在Book 或Video 类中覆盖toString(),它会从Book 或Video 运行toString(),这是应该的——但它的运行方式似乎在我的列表中的元素是 Object 还是我的某个类的实例。
我想过但不知道如何实施的解决方案:
将元素转换回Book 或Video。 挑战:如何可变地转换为多种类型以及如何内联。
使用另一个类似数组/列表的容器,允许特定数据类型保留Book 和Video。 挑战:不熟悉,可能过于复杂,我希望能够使用列表。
结语
如果您想知道——是的,这是课堂作业。这就是为什么我需要一个列表/数组而不是每种类型两个,这将使我的生活更轻松。我没有上传所有代码的原因是考虑到我创建了三个独特的类,并且尝试使问题尽可能简单,并且每个类不仅仅是一个Title 和一个方法。如果合适的话,我可以上传实际的代码。
感谢您抽出时间与我一起思考并解决这个问题。
【问题讨论】:
-
你能不能修改
Book和Video的课程或者因为作业不能修改? -
我自己制作了课程,是的,我可以更改它们