【问题标题】:Implementing a generic list that can hold multiple data types in Java/JavaFX在 Java/JavaFX 中实现可以保存多种数据类型的通用列表
【发布时间】:2014-11-18 06:14:23
【问题描述】:

我需要开发一个包含多种库类型的库的列表。例如,库可以是视频库或照片库。如果相关,我想使用 JavaFX 遵循 MVC 设计模式。请参阅下面的 UML 图参考我的问题:

图一

所以我想在我的库模型中为列表使用泛型类型,如下所示:

public class LibraryModel<T> {
    private List<T> aList;
}

但是,这不起作用,因为当我实例化库列表时,我需要指定一个类型。所以通过这种方式,我只能将照片或视频库指定为列表,不能同时指定两者。

我试图引入一个名为“Library”的泛型类型,它将被列在列表中(作为超类),由 PhotoController/VideoController 扩展:

图 2

public class LibraryModel {
    private List<Library> aList;
}

在图 2 中,我可以创建一个通用库列表。但这将如何影响我执行特定照片/视频任务的能力?假设我有以下方法:

超类方法:

displayAll()
add()
remove()

图片库方法:

displaySlideShow()

视频库方法:

playVideo()

通过将库存储为超类,我将如何调用其他库类型的特定方法?这合法吗?

请放轻松,我还在学习 Java,提前谢谢。

【问题讨论】:

标签: java list model-view-controller javafx uml


【解决方案1】:

使用抽象类

图书馆。

abstract class Library {

}

然后创建子类。

照片库。

class PhotoLibrary extends Library {

     displaySlideShow(){

     }   
}

视频库。

class VideoLibrary extends Library {

        playVideo() {

        }

}

在主类或其他你可以使用它们。

private List<Library> aList;
aList.add(new PhotoLibrary());
VideoLibrary l2 = new VideoLibrary();
aList.add(l2);

然后你可以调用可用的方法,

Library l = aList(i);
if(l instanceof PhotoLibrary) {
     PhotoLibrary pl = (PhotoLibrary)l;
     pl.displaySlideShow();
}
else if(l instanceof VideoLibrary) {
     VideoLibrary vl = (VideoLibrary)l;
     vl.playVideo();
}

【讨论】:

  • 在您的代码中,我可以将库界面留空吗?我真的只想对列表进行操作(添加/删除/显示)。除了列表操作之外,它们不会有任何重叠的方法。最重要的是,我能否像这样调用仅对一个库可用的特定方法: aList.get(2).playVideo() // 仅当对象为 VideoLibrary 类型时才可用
  • 我玩过你的代码,它回答了我自己的问题。如果列表的类型是接口的,我肯定仅限于接口的方法。这让我质疑如何访问不属于该界面的其他方法。
  • 完美,这正是我需要的,谢谢:)
猜你喜欢
  • 2013-09-17
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 2011-12-01
  • 2011-05-19
  • 2019-03-16
  • 2018-02-28
  • 2020-02-16
相关资源
最近更新 更多