【问题标题】:Cannot resolve constructor for ArrayList [closed]无法解析 ArrayList 的构造函数 [关闭]
【发布时间】:2016-08-16 19:18:15
【问题描述】:

我创建了一个新类和一个这样的构造函数:

public class Person {
  String firstName;
  String lastName;
  String pass;

  public Person(){}

  public Person(String f,String l,String p){
    firstName=f;
    lastName=l;
    pass=p;
  }
}

然后我在 MainActivity 中创建了一个对象:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    ArrayList<Person> list = new ArrayList<Person>();
    ArrayList<Person> list2 = new ArrayList<Person>("a","b","c");
}

问题是我有这样的消息:

无法解析构造函数 'ArrayList(java.lang.String,java.lang.String,java.lang.String)'

并且在 Person 类中说构造函数从未使用过。

我做错了什么?

【问题讨论】:

  • 你想用 a,b,c 初始化你的 list2 吗?
  • 因为没有这样的构造函数
  • What did I mistake ? 你创建了Person 类,然后你创建了一个包含PersonArrayList,但是你却给了它String

标签: java android arraylist


【解决方案1】:

您正在构建人员列表。但是您提供了创建 PERSON 的论据。

你可以这样写:

list2 = new ArrayList<>(Arrays.asList(new Person("a","b","c")));

或者:

list2 = new ArrayList<>(Collections.singletonList(new Person("a","b","c")));

在其他语言中,可能存在对“匹配”功能的“隐式”(在幕后)查找;这样当您提供参数来创建 Person 时,就会调用相应的构造函数。

在 Java 中,这是行不通的。并注意:即使这样可行; ArrayList没有有一个构造函数来获取对象并将它们添加到列表中。

长话短说:您必须使用不同的语法。您可以使用其他人的建议;或者,如果您更喜欢“oneliner”(但“更昂贵”)的解决方案......请尝试使用我的建议。当然:研究我正在使用的库函数的 javadoc;因为他们对返回的列表设置了某些限制。

并从 4castle 获取输入:最好在左侧强制执行列表类型,例如:

List<Person> list2 = Arrays.asList<>(new Person("a","b","c"));

含义:如果可能,使用基础集合接口;而不是它们背后的具体类。这将允许您稍后更改实际的实现。但是,如果您在整个地方都使用“ArrayList”,则必须更改您固定该类型的每个地方。因此,最好尽可能避免这种情况!

【讨论】:

  • 一个空的&lt;&gt; 对方法没有任何意义,只对构造函数有任何意义。所以Arrays.asList 不需要&lt;&gt;
  • 你有一只敏锐的眼睛。再次感谢!
  • 但是:您也可以很好地将&lt;&gt; 放在方法调用上。让它们为空是没有意义的。您可以使用它们来提供类型提示,请参阅stackoverflow.com/questions/36409647/…
  • Arrays.asList 还返回一个大小不可变的List,所以最好还是用ArrayList 包装。
  • Person"a","b","c") 中缺少的 ( 让我抽搐,但我仍然赞成,
【解决方案2】:

您正在实例化 ArrayList,而不是 Person。 对于你的第二个列表,试试这个:

ArrayList<Person> list2 = new ArrayList<Person>();
list2.add(new Person("a","b","c"));

您需要在创建List 后声明您的Person 对象和add

【讨论】:

    【解决方案3】:

    这似乎是罪魁祸首:

     ArrayList<Person> list2 = new ArrayList<Person>("a","b","c");
    

    试试这个:

    ArrayList<Person> list2 = new ArrayList<Person>();
    Person p = new Person("a","b","c");
    list2.add(p)
    

    【讨论】:

      【解决方案4】:

      遇到此类问题时,请始终使用 java 文档。 由于构造函数在抱怨,最好查看documentation of the ArrayList constructor

      ArrayList() - 构造一个初始容量为 10 的空列表。

      ArrayList(Collection c) - 构造一个包含指定集合元素的列表,按集合迭代器返回的顺序排列。

      ArrayList(int initialCapacity) - 构造一个具有指定初始容量的空列表。

      这表明您绝对不能将 Person 对象传递给构造函数。它要么什么都不带,要么是 Collection 要么是 int。 Arrays.asList() 是当您有几个对象时构建 Collection 的一种简单方法。

      正如 GhostCat 所提到的,以下内容肯定适用于您提到的场景。原因是 asList 会返回一个你想要的 ArrayList。

      List<Person> list = Arrays.asList(new Person("a","b","c")));
      

      但是,例如,如果您要创建一个集合。您将不得不使用以下内容

      Set<Person> set = new HashSet(Arrays.asList(new Person("a","b","c")));
      

      它抱怨 Person 构造函数没有被使用,因为它肯定没有被使用。构造函数的用法必须始终跟在“new”关键字之后。在你的情况下,它不是。

      【讨论】:

        【解决方案5】:

        您使用的是字符串而不是人员。

        你需要做这样的事情:

        ArrayList<Person> list = new ArrayList<Person>();
        Person p = new Person (first, last, pass);
        list.add (p);
        

        你也可以试试这个:

        ArrayList<Person> list = new ArrayList<Person>() {{
            add(new Person (first1, last1, pass1));
            add(new Person (first2, last2, pass2));
            add(new Person (first3, last3, pass3));
        }};
        

        如果有帮助,请告诉我。如果没有,我可以尝试更多。

        【讨论】:

          猜你喜欢
          • 2017-07-27
          • 2015-05-29
          • 1970-01-01
          • 2015-05-05
          • 2017-02-28
          • 2016-09-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多