【问题标题】:Android: Constructor is ambiguous when I pass Null, but not when I pass a variable assigned to Null [duplicate]Android:当我传递 Null 时,构造函数不明确,但当我传递分配给 Null 的变量时不明确 [重复]
【发布时间】:2015-02-15 23:46:08
【问题描述】:

我写了以下语句来创建ArrayAdapter<String>

ArrayAdapter<String> arrayListAdapter = new ArrayAdapter<String>(getActivity(), R.layout.fragment_result_titles, R.layout.row_listview, arrayList);

但是我得到了构造函数调用不明确的错误。

我了解当传递 null 时,不清楚我们调用的是 ArrayAdapter(Context context, int resource, int textViewResourceId, T[] objects)ArrayAdapter(Context context, int resource, int textViewResourceId, List&lt;T&gt; objects) 中的哪一个。

但后来我尝试了这个:

ArrayList arrayList = null;
ArrayAdapter<String> arrayListAdapter = new ArrayAdapter<String>(getActivity(), R.layout.fragment_result_titles, R.layout.row_listview, arrayList);

这并没有给出错误,虽然我仍然通过null,不是吗?

为什么会这样?

【问题讨论】:

  • 因为编译器解决了歧义,当您传递 arrayList 引用时
  • ...如果您在此处传递 null,您也会获得 NPE(就在您将此适配器设置为 AdapterView(ListView) 之后,因为底层代码将尝试调用((List)null).size())...您应该使用这个构造函数:ArrayAdapter(Context context, int resource, int textViewResourceId)

标签: java android arraylist adapter android-arrayadapter


【解决方案1】:

这是因为在第二种情况下,arrayList 是一个 ArrayList 类型的变量,它恰好为空。在第一种情况下,没有关于参数的类型信息,因此编译器不知道应该调用哪个方法。您可以使用(List) null 作为参数使第一个案例工作。

【讨论】:

    【解决方案2】:

    当你像这样设置 null 时:

    ArrayAdapter(context, resource, textViewResourceId, null);
    

    你正在设置一个空指针(指向任何地方的指针),这个空可以是任何对象。

    另一方面,当你这样做时:

    ArrayList arrayList = null; 
    ArrayAdapter arrayListAdapter = new ArrayAdapter(getActivity(), R.layout.fragment_result_titles, R.layout.row_listview, arrayList);
    

    您正在内存中创建一个ArrayList 类型指针(指向没有对象,但有类型)。 Java 只能将对象分配给相同类型(或继承类型)的变量。所以,这还不是模棱两可的,编译器可以知道必须使用哪种方法。

    【讨论】:

    • 但是内存不是只有在我们使用new操作符创建对象时才分配的吗?
    • 是的,当你这样做时:ArrayList 数组;你正在做一个指向任何东西的指针,但是有类型。当您执行此操作时:array = new ArrayList(),您正在分配内存并将数组变量指向新分配的对象。但是自从您创建指针以来,该类型就存在了。
    【解决方案3】:

    要添加到 Petter 的答案,以下内容也将起作用:

    new ArrayAdapter<String>(getActivity(), R.layout.fragment_result_titles, R.layout.row_listview, (ArrayList)null);
    

    正是因为您提供了 Java 需要的类型信息,以解决使用哪个构造函数的歧义。

    【讨论】:

      猜你喜欢
      • 2011-12-23
      • 2014-03-07
      • 2021-02-05
      • 1970-01-01
      • 2015-08-03
      • 1970-01-01
      • 2015-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多