有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java中参数化和原始类型实例化之间的泛型差异

比如说,我有一个类Alpha,它有两个形式参数K and V

现在,我想用具体类型CK and CV初始化它的一个对象

我想知道,它们之间有什么区别

Alpha<CK, CV> alpha = new Alpha<CK, CV>();

以及

Alpha<CK, CV> alpha = new Alpha();

因为,他们都不允许我写或读任何东西,除了他们声明的内容。而且,既然泛型只用于在编译时确保类型安全,那么如果我不能对它做任何错误,为什么它会抛出警告呢


共 (1) 个答案

  1. # 1 楼答案

    问题在于

    Alpha<CK, CV> alpha = new Alpha();
    

    在左侧,您使用的是泛型类型Alpha,而在右侧,您使用的是原始类型Alpha。Java中的原始类型实际上只是为了与泛型之前的代码兼容而存在的,并且不应该在新代码中使用,除非您必须这样做

    对于Alpha<CK, CV> alpha = new Alpha()的原始示例,编译器会为该赋值生成一个警告,因为它必须。考虑这一点:

    List<String> strings = ... // some list that contains some strings
    
    // Totally legal since you used the raw type and lost all type checking!
    List<Integer> integers = new LinkedList(strings);
    

    泛型的存在是为了提供编译时保护,防止做错误的事情。在上面的示例中,使用raw类型意味着您无法获得此保护,并且在运行时会出现错误。这就是为什么不应该使用原始类型

    // Not legal since the right side is actually generic!
    List<Integer> integers = new LinkedList<>(strings);