微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在 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>,它仍然可以正常运行。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。