Android:当我传递Null时,构造函数是不明确的,但是当我传递分配给Null的变量时则不然

时间:2014-12-17 12:14:40

标签: java android arraylist adapter android-arrayadapter

我写了以下语句来创建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<T> objects)中的哪一个正在调用。

但后来我尝试了这个:

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

虽然我仍在传递null,但这不会给出错误,不是吗?

为什么会这样?

3 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:2)

当你像这样设置null时:

ArrayAdapter(context, resource, textViewResourceId, null);

您正在设置空指针(指向任何地方的指针),此null可以是任何对象。

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

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

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

答案 2 :(得分:2)

要添加Petter的答案,以下内容也适用:

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

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