【问题标题】:Can I have define ArrayLists and Other Data Structures that extend interfaces? [duplicate]我可以定义扩展接口的 ArrayLists 和其他数据结构吗? [复制]
【发布时间】:2016-07-01 03:08:21
【问题描述】:

我有许多实现接口的类。 我可以像这样定义堆栈、队列和ArrayLists 吗?

ArrayList<Class<? extends BaseClass>> 

存储对象?在我的场景中,每个对象都来自 Stack 或 ArrayList 中的不同类? 这种实施的优点和缺点是什么? 我是 Java 新手,因此是这个问题。对此有何替代建议?

【问题讨论】:

  • 你可以。利弊取决于你需要什么。
  • 您定义的列表是类,而不是这些类的对象。如果您想要扩展BaseClass 的对象列表,您正在寻找ArrayList&lt;BaseClass&gt;。
  • 哦,谢谢。我在那里也很困惑。我是这样写的,因为当我们声明 ArrayLists 时,我们在里面给出了类名。所以 ArrayList 将允许我保存所有实现接口 BaseClass 的类的对象?

标签: java arraylist interface


【解决方案1】:

是的,你可以。

优点是您可以存储各种类型的对象并确保它们实现相同的合同,因此可以多态地处理它们。如果不使用Object,您将无法将它们存储在单个结构中;假设不存在其他共性。

缺点是,如果不进行额外检查,您将无法知道它们的类型,因此仅限于该接口提供的功能。然后你会坚持检查实例类型,然后进行强制转换,以便使用不常见的功能。

【讨论】:

    【解决方案2】:

    我有很多实现接口的类

    如果BaseClass 是interface 并且您希望将BaseClass 的任何子类型存储在ArrayList 或Stack 中,那么声明ArrayList&lt;Class&lt;? extends BaseClass&gt;&gt; 是错误的。就像,

    List<BaseClass> arrList = new ArrayList<BaseClass>();
    

    我可以像这样定义 Stacks 、 Queues 和 ArrayLists 吗?

    是的,您可以在基本类型接口上定义ArrayList 或Stack,并放入具体子类的对象中。

    在我的场景中,每个对象都来自 堆栈,还是 ArrayList?

    是的,如果您已插入。您可以在该 ArrayList 中插入 BaseClass 的任何子类型,因此如果您有 put 这样的元素,它们就会在那里。

    这种实现方式的优缺点是什么?

    这些将与 ChiefTwoPencils 的答案中已经列出的相同 - 您可以将各种类型的对象存储在一个 List 中,但是当您从列表中检索对象以进行处理时,您可能需要检查它们的类型等(如果对某些子类型的特定行为感兴趣)。

    希望对你有帮助!!

    【讨论】:

      猜你喜欢
      • 2016-09-17
      • 2023-03-23
      • 1970-01-01
      • 2012-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-18
      相关资源
      最近更新 更多