Java 泛型 - 允许混合类型吗?

标签 java generics

我之前运行了一些测试,但找不到关于为什么这段代码会这样做的解释:

public class Test {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList(Arrays.asList(Double.valueOf(0.1234)));
        System.out.println(list.get(0)); //prints 0.1234
        Object d = list.get(0);
        System.out.println(d.getClass()); // prints class java.lang.Double
        System.out.println(list.get(0).getClass()); // ClassCastException
    }
}

这提出了几个问题:

  • 为什么 List 首先接受 Double(它应该编译)?
  • 为什么第二个打印品有效而不是第三个打印品,尽管看起来他们在做同样的事情?

编辑
我理解以下 2 个陈述:

List aList = new ArrayList(); //I can add any objects in there
List<Integer> aList = new ArrayList<Integer>(); //I can only add something that extends Integer in there

但我不明白为什么这个被授权以及为什么它实际上在运行时在某种程度上起作用,尽管有些操作会产生 ClassCastException - 我本以为上面发布的代码的第一行会出现 ClassCastException:

List<Integer> aList = new ArrayList(); //I can any objects in there

最佳答案

这个:

new ArrayList(Arrays.asList(Double.valueOf(0.1234)))

创建一个原始的(未类型化的)ArrayList,您可以在其中放置任何内容。这是正确的做法:

new ArrayList<Integer>(Arrays.asList(Double.valueOf(0.1234)))

现在不应该编译。

关于Java 泛型 - 允许混合类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8433969/

相关文章:

java - Spring 在 RedirectView 之后处理 FlashAttributes

java - 如何手动指定 derby.system.home 属性来启动 derby 服务器

java - Java,TargetDataLine读取的字节,错误的代码将其字节保存到文件中

java - 将 JAXB、泛型和反射结合到 XML 序列化我所有的 Java 类

PowerShell:无法过滤通用列表的特殊情况

java - Spring MVC 中 Bean 数量的限制

java - 使用 JAVA API 的 Rally 项目的修订历史

class - Haskell构造一个类型包含类

c# - 具有多个类的泛型

java - 尝试在列表中查找类