【问题标题】:Java -- Passing ArrayList to Method and ReturningJava -- 将 ArrayList 传递给方法并返回
【发布时间】:2015-09-27 05:02:13
【问题描述】:

首先——要明确一点——这是的家庭作业,我只是想学习如何正确地做到这一点(我不想要答案,只是指导)。我在这个网站和整个 Google 上进行了一些搜索,但似乎找不到解决方案。

无论如何:

在我的主类中,我创建了一个试图传递给方法的 ArrayList。出于某种原因,我无法将 ArrayList 作为参数传递,即使该方法设置为接收一个。我遇到了错误:“类中的构造函数不能应用于给定类型。”

可能我犯了一个简单的错误——谁能帮我理解这里发生了什么?

public static void main(String[] args) 

{
        Deck cards = new Deck();
        ArrayList<String> deck = new ArrayList();

        deck = cards.CreateDeck();

        Hand myHand = new Hand(deck);  //here is the error
}

那么……

public class Hand {


    public static ArrayList<String> Hand (ArrayList<String> deck)
    {
        ArrayList<String> yourHand = new ArrayList<String>(deck);
        for (int i = 5; i < yourHand.size(); i++) {
            yourHand.remove(i);
        }

        return yourHand;
    }

}

【问题讨论】:

  • 我没有看到你在任何地方调用 Hand(ArrayList&lt;String&gt;) 方法。
  • 正确的格式是Hand myHand = Hand.Hand(deck);。如果你想让它成为一个构造函数,那么你的 Hand 类应该有这个 public Hand (ArrayList&lt;String&gt; deck){...}
  • 或者更确切地说是ArrayList&lt;String&gt; myHand = Hand.Hand(deck);
  • 我认为您的意图是在构造函数中传递卡片组,但构造函数不能有返回值。
  • 您已使用Hand 作为您的方法的名称。 Java 命名标准使用小写字母作为方法名称的第一个字符,即hand。考虑遵循本指南 - 即public static List&lt;String&gt; hand (List&lt;String&gt; deck) - 其他人会更容易理解您的代码。另外,请注意使用List 作为类型,而不是ArrayList - 请参阅Liskov substitution principle

标签: java methods arraylist constructor


【解决方案1】:

您试图在Hand 类构造函数中传递Arraylist,但在Hand 类中没有接受列表的构造函数。

你需要在Hand类中做这样的事情

private List<String> deck;
public Hand (List<String> deck) {
    this.deck = deck;
}

【讨论】:

  • 嗯,这是一个有趣的语法 :) Scala?
  • 不过,他似乎不想将套牌传递给构造函数;他似乎只想用静态方法来操作它。
  • @Carcigenicate:其实问题是他现在还不清楚他想要什么。
  • @sstan 是的,但很明显他正在尝试将数组列表传递给静态方法。 deck 在他的例子中从来不是一个字段,所以我严重怀疑这是否接近他的意图。
  • 同意斯坦。我们都提出了不同的建议,现在由他决定如何纠正
【解决方案2】:

构造函数不能有返回类型,也不能是static。 您实际定义的是一个类方法,无需实例化Hand 对象即可调用该方法。调用Hand.Hand(deck) 将返回ArrayList&lt;String&gt;,而不是Hand 对象。此外,方法不应与类同名。

【讨论】:

    【解决方案3】:

    您正在尝试使用静态方法来实例化 Hand,但这是行不通的。

    如果您的意图只是将ArrayList 传递给Hand 内部的方法,请执行以下操作:

    将方法的名称更改为其他名称(不以大写字母开头),并去掉 main 中的 new 关键字。

    public static void main(String[] args) 
    {
            Deck cards = new Deck();
            ArrayList<String> deck = new ArrayList();
    
            deck = cards.CreateDeck();
    
            //You had Hand as a method, which can't be initialized!
            List<String> changedDeck = doSomethingWithDeck(deck);
    }
    

    那么,你的静态方法类应该是这样的:

    public class Hand {
    
    
        public static ArrayList<String> doSomethingWithDeck(ArrayList<String> deck)
        {
            ArrayList<String> yourHand = new ArrayList<String>(deck);
            for (int i = 5; i < yourHand.size(); i++) {
                yourHand.remove(i);
            }
    
            return yourHand;
        }
    
    }
    

    但是,如果您的意图是实际创建一只手,则需要说明您的意图是什么,因为构造函数不能是静态的,也不能返回值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-20
      • 1970-01-01
      • 1970-01-01
      • 2013-07-15
      • 1970-01-01
      • 1970-01-01
      • 2014-04-27
      相关资源
      最近更新 更多