【问题标题】:In android This code is working Can anyone tell me why and how? [duplicate]在 android 此代码正在运行 谁能告诉我为什么以及如何? [复制]
【发布时间】:2021-07-17 00:08:53
【问题描述】:

在 Android 中,我正在练习 recycling view,我注意到当我 将 String 类型数组转换为 Integer 类型列表时,它工作正常以及我放入将字符串类型列表转换为整数类型 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);

【问题讨论】:

  • 您使用的是原始类型(例如 new ArrayList() 而不是 new ArrayList&lt;String&gt;)。那些有效地破坏了通用类型系统,不应该使用。
  • 但没有通用 List listOfWords @Joachim Sauer
  • 是的,此时&lt;Integer&gt; 已经是一个谎言:它确实包含字符串,但是由于原始类型,编译器不会抱怨(除非您使用原始类型:您 确实收到了警告,不是吗?但你厚颜无耻地忽略了它)。
  • 使用泛型实例是个好习惯吗?
  • “通用实例”是什么意思?如果您的意思是ArrayList&lt;Foo&gt; 而不是ArrayList:是的,绝对是。使用原始类型(即没有&lt;Foo&gt; 的类型)仅允许向后兼容古代代码,主动破坏类型系统并在使用时产生警告(您确实看到了编译器警告,不是吗?)。所有这些都在上面链接的问题/答案中进行了解释。

标签: java android list android-recyclerview android-arrayadapter


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    • 2021-04-10
    • 1970-01-01
    相关资源
    最近更新 更多