【问题标题】:List<E> Implementations列出<E> 实现
【发布时间】:2016-10-02 17:46:42
【问题描述】:

我正在为我的数据结构类创建一个带有卡片的简单战争游戏。

我目前有一个方法如下:

Play Turn(List<Card> player1, List<Card> player2){
    return null;
}

上述方法(目前我理解是不完整的)假设接受 List 接口的任何子接口(即 Stack、ArrayList、LinkedList 等)。

堆栈使用 pop() 返回/删除堆栈的顶部,像 ArrayList 或 LinkedList 我可以使用 get() 方法返回第一个元素,然后使用 remove() 方法删除该元素.

那么有没有一种方法可以让我以通用的方式做到这一点,还是我必须创建一个针对我允许使用的每个版本的 List 量身定制的方法?

【问题讨论】:

  • Stack, ArrayList, ..., 都实现了List 接口的方法(如get, remove, ...),所以你可以将它们用于一切......为什么在不需要时使用特定的Stack 方法(如pop)?
  • 如果您将实现限制为 List 方法,则不需要单独的实现。如果您认为您需要了解底层类型,请三思。
  • 这回答了我的问题。我的印象是,虽然我在'List'界面下使用'Stack',但与使用'get'和'remove'等方法相比,我必须使用'pop'等方法。跨度>
  • 接受接口的全部意义在于您不必担心实际的实现。使用List 方法,就是这样。

标签: java list


【解决方案1】:

请学习并遵循 Java 编码标准(GoogleSun/Oracle)。没有它们,您的代码将难以理解。

你的方法应该是这样的:

Play turn(List<Card> player1, List<Card> player2) {
    return null;
}

含义很明确:您可以在实现List 接口的堆上传递对Object 的任何引用。这意味着您的实现应该只调用List 接口中的方法。你不应该关心你给出的参考的具体实现。

我不明白Stack 在此界面中的播放位置。 Stack 可以使用List 实现,但它的方法(push、pop、peek)不是List 接口的一部分。它们将不受界面中参数的限制。

如果您认为您的方法需要为每个玩家提供Stack&lt;Turn&gt;,那么您不应该将List 作为参数。

【讨论】:

  • ){之间应该有空格吗? (我不完全确定 Java 编码标准是什么,因为我主要是 C# 人,但我看到的示例遵循第一种格式......)
  • 我指的是方法名称 - 它应该是 turn,而不是 Turn。我会在两者之间留一个空间。您将花括号放在正确的位置:在方法声明的末尾,而不是在下一行。
  • 我只是二年级学生,还在学习所有的标准,所以我为我所犯的错误道歉。
  • @BalinKingOfMoria 是的,那里应该有一个空间。
【解决方案2】:

任何实现List 接口的类都会做出一系列关于调用List 方法时会发生什么的承诺。他们可能以不同的方式履行承诺,但承诺将在所有实现中得到满足。

例如,在List 的任何实现上调用get(0) 将返回列表中的第一项。无论您使用的是ArrayListLinkedListStack 还是JoesCustomList,这都是正确的。因此,无需针对不同类型的列表定制您的方法。

【讨论】:

    【解决方案3】:

    相反:除非你有非常好的理由,否则你绝对想避免任何一种沮丧!因此,任何类型的 instanceof-check 和向下转换为 List 接口的具体实现都是您不希望在代码中使用的东西!

    含义:这些接口的主要优点之一是它们已经包含您需要调用的方法。

    换句话说:此类接口的关键价值之一是接口本身提供了完成工作所需的那些方法。它们提供了强大的抽象,让您的代码完全不知道“该接口是如何实际实现的!”的问题!

    【讨论】:

      猜你喜欢
      • 2011-01-11
      • 2020-10-30
      • 2011-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-29
      • 2011-10-31
      相关资源
      最近更新 更多