我有两个类Book
和Video
,还有一个Driver
类,用来保存Book
和Video
对象的列表,以便有一个虚拟库。每个类都有一个方法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
但是,如果我从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()
?如果我在toString()
或Book
类中覆盖Video
,它会根据需要从toString()
或Book
运行Video
,但是看来它的运行方式是在我的列表元素是Object
还是我的一个类的实例之间来回切换。
将元素投射回Book
或Video
。 挑战:如何可变地转换为多种类型以及如何进行内联。
使用另一个数组/类似列表的容器,该容器将允许特定的数据类型保留Book
和Video
。 挑战:不熟悉,可能会过于复杂,我希望能够使用列表。
如果您想知道-是的,这是课堂作业。这就是为什么我需要一个列表/数组而不是每个类型两个的原因,这会使我的生活变得更加轻松。我没有上传所有代码的原因是,考虑到我制作了三个独特的类,试图使问题尽可能简单,每个类的意义远远超过Title
和一个方法。如果合适的话,我可以上传实际代码。
感谢您抽出宝贵的时间与我一起思考并解决这个问题。
答案 0 :(得分:0)
您不希望在此列出对象;您的图书馆旨在容纳类似图书馆的东西。文件不打算存储在这里。锁,输入流,整数,字符串,汽车,房屋或星系也不是。
定义可以存储在库中的概念。将此设置为界面:
public interface LibraryWork {
String getTitle();
}
这是说:“图书馆作品”是一种概念,所有图书馆作品的共同点是它们都有标题。
然后:
class Book implements LibraryWork {
...
}
现在,您可以使您的库中没有Object的列表,Object列表虽然没用,而且范围太广,但实际上是List<LibraryWork>
。
现在您可以随意调用getTitle。
通常,避免使用.getClass,instanceof,class强制转换等-如有必要,请枚举库工作类型的枚举,并让Book类在必要时返回“ BOOK”。
注意:我不太喜欢LibraryWork这个名字,也许您能想到更好的东西。