【问题标题】:Calling a method from a class from an element within a list of Objects从对象列表中的元素调用类中的方法
【发布时间】:2020-12-16 13:35:50
【问题描述】:

背景:

我有两个类 BookVideo 和一个 Driver 类来保存 BookVideo 对象的列表,以便拥有一个虚拟库。每个类都有一个方法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

但是,如果我从 BookVideo 类调用一个方法(相同的方法名称):

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()?如果我在BookVideo 类中覆盖toString(),它会从BookVideo 运行toString(),这是应该的——但它的运行方式似乎在我的列表中的元素是 Object 还是我的某个类的实例。

我想过但不知道如何实施的解决方案:

将元素转换回BookVideo挑战:如何可变地转换为多种类型以及如何内联。

使用另一个类似数组/列表的容器,允许特定数据类型保留BookVideo挑战:不熟悉,可能过于复杂,我希望能够使用列表。

结语

如果您想知道——是的,这是课堂作业。这就是为什么我需要一个列表/数组而不是每种类型两个,这将使我的生活更轻松。我没有上传所有代码的原因是考虑到我创建了三个独特的类,并且尝试使问题尽可能简单,并且每个类不仅仅是一个Title 和一个方法。如果合适的话,我可以上传实际的代码。

感谢您抽出时间与我一起思考并解决这个问题。

【问题讨论】:

  • 你能不能修改BookVideo的课程或者因为作业不能修改?
  • 我自己制作了课程,是的,我可以更改它们

标签: java arraylist types


【解决方案1】:

你不想要这里的对象列表;您的图书馆旨在容纳类似图书馆的东西。文件不打算存储在此处。锁、输入流、整数、字符串、汽车、房子或星系也不是。

定义可以存储在库中的内容的概念。将其设为接口:

public interface LibraryWork {
    String getTitle();
}

这就是说:有“图书馆作品”的概念,所有图书馆作品的共同点是它们都有标题。

然后:

class Book implements LibraryWork {
    ...
}

现在,您可以让您的库有一个不是 Object 的列表,这非常无用且过于宽泛,而是一个 List&lt;LibraryWork&gt;

现在您可以随意调用 getTitle 了。

一般来说,避免使用 .getClass、instanceof、class casts 等 - 如果必须,请对库工作类型进行枚举,如果必须,让您的 Book 类返回“BOOK”。

注意:我不太喜欢 LibraryWork 这个名字,也许你可以想点更好的。

【讨论】:

  • 如果界面上唯一的东西是String getTitle(),那么我已经采用了HasTitle的一些Google项目的约定。
  • @chrylis-cautiouslyoptimistic- 打破了我读过的最明智的命名约定。 “HasTitle”并没有真正描述太多。在这种情况下,它比“任何有标题的东西”要深入得多(我可以将活人存放在图书馆里吗?我不这么认为)。 “工作”确实涵盖了这个概念,但不幸的是,“工作”在英语中带有很多不幸的同音词。
  • >界面上唯一的东西
  • 这不相关。你是本末倒置。如果我们坚持你的逻辑,那么应该只有一个标记接口,它应该被称为“MarkerInterface”。我们实际上有很多。首先,您考虑事物是什么,然后描述它具有的方法(这可能是一个令人失望的小列表)。您所描述的是一种使 java 表现得像一种蹩脚的结构类型语言的方法。
  • 这完美解决了我的问题。不幸的是,我的教授只会采用数组/列表,而实际有效的 toString() 覆盖正是他想要的。然而,为了我自己的乐趣和学习,我决定复制一个实现这个解决方案的副本。非常感谢我的朋友。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-21
  • 1970-01-01
  • 2018-03-11
  • 2022-08-14
  • 2016-04-28
  • 1970-01-01
  • 2018-10-21
相关资源
最近更新 更多