我写了以下语句来创建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
,但这不会给出错误,不是吗?
为什么会这样?
答案 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所需的类型信息,以便解决使用哪个构造函数的歧义。