首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ArrayList<Integer>允许添加字符串吗?

ArrayList<Integer>允许添加字符串吗?
EN

Stack Overflow用户
提问于 2015-05-18 13:48:46
回答 2查看 1.3K关注 0票数 7

我看到了以下代码,这是向List添加元素的一个简单示例

代码语言:javascript
运行
复制
    List list = new ArrayList<Integer>();
    ListIterator<Integer> litr = null;
    list.add("A");

    list.add("1");

    list.add(5);

    litr = list.listIterator();
    while(litr.hasNext()){
        System.out.println("UIterating " + litr.next());
    }

我原以为它会抛出一个ClassCastException,但是它把它写到了控制台

代码语言:javascript
运行
复制
A
1
5

看起来怪怪的。当我试着:

代码语言:javascript
运行
复制
 List<Integer> list = new ArrayList<Integer>();

我有编译时错误。

如果有人能解释如何将String对象添加到ArrayList中,我将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-18 13:57:24

您将新的ArrayList分配给一个非类型化列表。泛型类型限制不适用于非类型化列表,它将允许您在其中放置任何您想要的内容。编译器不会跟踪您的非类型化列表是否引用了使用泛型类型声明的内容。

无论如何,这不会产生一个ClassCastException,泛型只会影响编译。在运行时

将类型放在list变量上的情况:

代码语言:javascript
运行
复制
List<Integer> list = new ArrayList<Integer>();

它应该会生成一个编译器错误,告诉您在集合中放置了错误的类型。

描述了遗留、非泛型代码和泛型代码如何在这篇文章中互操作。

在适当的泛型代码中,Collection将始终伴随类型参数。当使用一个泛型类型(如Collection )而没有类型参数时,它被称为原始类型。 大多数人的第一本能是,集合实际上意味着Collection<Object>。但是,正如我们前面所看到的,在需要Collection<Part>的地方传递Collection<Object>是不安全的。更准确的说法是,类型集合表示一些未知类型的集合,就像Collection<?>一样。 但是等等,这也不对!考虑对getParts()的调用,它返回一个集合。然后将其分配给k,这是一个Collection<Part>。如果调用的结果是Collection<?>,则分配将是一个错误。 实际上,分配是合法的,但它会生成未经检查的警告。需要警告,因为编译器不能保证其正确性。我们无法检查getAssembly()中的遗留代码,以确保返回的集合确实是部件的集合。代码中使用的类型是Collection,可以合法地将所有类型的对象插入到这样的集合中。 这不应该是个错误吗?从理论上讲,是的;但实际上,如果泛型代码要调用遗留代码,则必须允许这样做。程序员应该让自己确信,在这种情况下,分配是安全的,因为getAssembly()的契约说它返回一个部件集合,尽管类型签名没有显示这一点。

票数 4
EN

Stack Overflow用户

发布于 2015-05-18 14:05:28

这是可能的,因为泛型是如何在Java中实现的--使用类型擦除,而且因为Java支持原始类型,以便向后兼容旧版本的Java (1.4及更高版本)。

泛型只存在于源代码中。编译器使用它们在编译时检查类型,然后丢弃泛型。在运行时,List<Integer>只是对象的List,它不知道它是否应该只包含Integer对象。

Java支持使用原始类型,如List,而不是List<Integer>,以实现与旧版本的向后兼容性。当您使用原始类型时,正如您在上面的代码中所做的那样,您将得到编译器警告。您不应该在新代码中使用原始类型--只有在需要处理无法更改的旧代码时才使用它们。

原始类型和类型擦除的组合允许您将对象类型放入不应该放在其中的列表中。

因为运行时的List不知道它的元素应该具有的类型,所以它不会检查任何东西,因此不会得到ClassCastException

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30304986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档