【问题标题】:I get ClassCast exception when I enumerate vector with String type parameter, but no exception is there with Integer as type parameter当我使用 String 类型参数枚举向量时出现 ClassCast 异常,但使用 Integer 作为类型参数时没有异常
【发布时间】:2016-08-10 09:56:12
【问题描述】:

我正在尝试使用向量并编写了一个简单的代码来通过枚举访问其元素。

Vector v = new Vector();
    v.add("Some String");
    v.add(10);

    Enumeration e = v.elements();
    while(e.hasMoreElements()) System.out.println(e.nextElement());

使用原始类型会产生预期的结果(打印元素)。但是,当我使用泛型类型的枚举器时,它会变得很棘手。

以String作为类型参数:

Vector v = new Vector();
    v.add("Some String");
    v.add(10);

    Enumeration<String> e = v.elements();
    while(e.hasMoreElements()) System.out.println(e.nextElement());

输出:

一些字符串

线程“main”java.lang.ClassCastException 中的异常:java.lang.Integer 无法转换为 java.lang.String

以整数作为类型参数:

Vector v = new Vector();
    v.add("Some String");
    v.add(10);

    Enumeration<Integer> e = v.elements();
    while(e.hasMoreElements()) System.out.println(e.nextElement());

输出:

一些字符串

10

这里发生了什么? 这两种情况都不应该产生ClassCast异常吗?

【问题讨论】:

  • Enumeration&lt;&gt; e = v.elements();这是怎么编译的?
  • @KonstantinYovkov 我认为这是一个错字,OP的意思是Enumeration&lt;String&gt;
  • 你正在使用 Vector 原始类型:stackoverflow.com/a/2770692/1608594 你不应该使用原始类型。

标签: java generics vector enumeration


【解决方案1】:

请注意,所有泛型在编译时都会被删除,这只是为了帮助编译器确认您没有犯错。此时您可能会收到几个警告,说您不应该使用原始类型(原始意味着 Vector 而不是 Vector&lt;String&gt; 等)。原始类型的泛型等效项是&lt;?&gt;,表示您将允许任何类型(请注意,这将导致您的代码不再编译)。

您看到的行为是因为有两个(实际上还有几个,但在您的情况下使用了两个)名称为 System.out.println() 和不同参数类型的函数,这称为(方法重载):

  1. System.out.println(String)
  2. System.out.println(Object)

在编译时决定为您的代码调用哪个。

在字符串示例中,枚举具有泛型类型String,并将调用第一个。但是,当它从您的Vector 传递一个Integer 对象时,这会在将其转换为字符串时导致失败。 因此,在这种情况下,编译器会将您的代码转换为以下(大致):

Enumeration e = v.elements();
while(e.hasMoreElements()) System.out.println((String)e.nextElement());

在整数示例中,枚举具有通用类型Integer,它将映射到System.out.println(Object),它接受StringInteger,所以一切顺利。

附带说明:默认情况下,您应该使用ArrayList 而不是Vector,由于Vector 中的遗留方法,它的界面更加简洁。另外Vector 它是同步的,导致不必要的开销。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-08
    • 1970-01-01
    • 2014-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多