从对象列表中的元素中的类中调用方法

时间:2020-08-27 15:58:31

标签: java arraylist types

背景:

我有两个类BookVideo,还有一个Driver类,用来保存BookVideo对象的列表,以便有一个虚拟库。每个类都有一个方法getTitle(),它从类构造函数的第一个参数作为String返回给定标题。此外,Driver类具有方法getList(),该方法以lib

的形式返回列表(在这种情况下为List<Object>)。

相关代码段:

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()?如果我在toString()Book类中覆盖Video,它会根据需要从toString()Book运行Video,但是看来它的运行方式是在我的列表元素是Object还是我的一个类的实例之间来回切换。

我已经考虑过但不知道如何实现的解决方案:

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

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

最后的话

如果您想知道-是的,这是课堂作业。这就是为什么我需要一个列表/数组而不是每个类型两个的原因,这会使我的生活变得更加轻松。我没有上传所有代码的原因是,考虑到我制作了三个独特的类,试图使问题尽可能简单,每个类的意义远远超过Title和一个方法。如果合适的话,我可以上传实际代码。

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

1 个答案:

答案 0 :(得分:0)

您不希望在此列出对象;您的图书馆旨在容纳类似图书馆的东西。文件不打算存储在这里。锁,输入流,整数,字符串,汽车,房屋或星系也不是。

定义可以存储在库中的概念。将此设置为界面:

public interface LibraryWork {
    String getTitle();
}

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

然后:

class Book implements LibraryWork {
    ...
}

现在,您可以使您的库中没有Object的列表,Object列表虽然没用,而且范围太广,但实际上是List<LibraryWork>

现在您可以随意调用getTitle。

通常,避免使用.getClass,instanceof,class强制转换等-如有必要,请枚举库工作类型的枚举,并让Book类在必要时返回“ BOOK”。

注意:我不太喜欢LibraryWork这个名字,也许您能想到更好的东西。

相关问题