java - 当我使用 String 类型参数枚举 vector 时,我得到 ClassCastexception,但使用 Integer 作为类型参数也不异常(exception)

标签 java generics vector enumeration

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

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

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

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

以字符串作为类型参数:

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

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

输出:

Some String

Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

以 Integer 作为类型参数:

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

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

输出:

Some String

10

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

最佳答案

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

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

  1. System.out.println(字符串)
  2. System.out.println(对象)

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

在字符串示例中,枚举具有通用类型 String并将调用第一个。然而,当它通过时 Integer来自你的 Vector 的对象,这会在将其转换为 String 时导致失败。 因此,在这种情况下,编译器会将您的代码(大致)转换为以下内容:

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

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

旁注:默认情况下你应该使用 ArrayList而不是 Vector ,由于 Vector 中的遗留方法,它的界面更加简洁.还有 Vector它是同步的,导致不必要的开销。

关于java - 当我使用 String 类型参数枚举 vector 时,我得到 ClassCastexception,但使用 Integer 作为类型参数也不异常(exception),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38870012/

相关文章:

java - facebook4j如何获取PictureURL大小480x480?

java - 为什么不能使用 spring AOP 更改响应类型,除了返回 Object

java - 是否可以从 Java 中的对象构造函数中删除泛型类型参数?

c# - 在表达式中引用通用属性

ios - Swift 泛型函数

java - 关于等待和通知

java - 被政策拒绝

c++ - 如何编写无分支 std::vector 扫描?

c++ - 为什么使用所有数字来测试素数比仅使用素数更快

java - Java 的 Vector 和 JTable 的问题