在 android 中此代码有效 谁能告诉我为什么以及如何?

问题描述

在 Android 中,我正在练习回收视图,我注意到当我将 String 类型数组转换为 Integer 类型列表时,它工作正常,并且在我放入时字符串类型列表到Interger类型ArrayAdapter它工作正常。

 String[] words = {"One","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten"};

 List<Integer> listofWords = new ArrayList(Arrays.asList(words));

ArrayAdapter<Integer> adapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1,listofWords);

ListView listView = (ListView) findViewById(R.id.list);

listView.setAdapter(adapter);

解决方法

它实际上是关于 Java 而不是 Android。 Java 集合(例如 ArrayList)在底层使用对象集合,当您定义 ArrayList<Integer>ArrayList<String> 时,它们之间实际上没有区别。他们都持有一个 Object[] 里面。所以实际上它们唯一的区别是编译器如何处理它们,如果我们使用像 get 这样的泛型函数,它将导致 ClassCastException,因为您可以在它们的实现中找到未经检查的强制转换。

ArrayAdapter 也以同样的方式定义,实际上 Lists 和 ArrayAdapter 不检查任何类型。换句话说,您愚弄了 IDE、lint 和编译器,并且因为这里没有类型检查,所以它可以毫无问题地工作(我不确定,但我认为在 ArrayAdapter 内部有一个代码调用 toString对于每个元素或检查它是否是一个字符串或不使用 instanceof)。此外,即使您使用 List<Object>,它仍然可以正常运行。