将参数化类型实例引用为其原始类型与使用原始类型引用另一个原始类型实例之间的区别?

时间:2018-11-09 22:36:53

标签: java generics type-erasure raw-types

我最近开始从基础开始学习Java,而我遇到了这个问题 关于泛型类型的“一点点”误解,引起了如下问题:

将参数化类型实例引用为其原始类型与 使用原始类型来引用另一个原始类型实例?

我的意思是,这是此代码段之间的区别:

ArrayList rawTypeList_NoRawInstance = new ArrayList</*Any type here*/>();

和这个:

ArrayList rawTypeList_RawInstance = new ArrayList();

代码:

import java.util.*;


public class TestGenerics{

   public static void main(String args[]){


          ArrayList rawTypeList_RawInstance = new ArrayList();
          ArrayList rawTypeList_NoRawInstance = new ArrayList<Integer>();  /* instead of Integer could be placed any kind of type, this 
                                                                            * is just an example */

          rawTypeList_RawInstance.add("example RawInstance");      // warning launched
          rawTypeList_NoRawInstance.add("example NoRawInstance");  // same warning here

          System.out.println(rawTypeList_RawInstance.get(0));      // content showed without errors/warning
          System.out.println(rawTypeList_NoRawInstance.get(0));    // same here

          String exampleRawInstance1    = (String)rawTypeList_RawInstance.get(0);   // raw type instance compiled without error 
          String exampleNoRawInstance1  = (String)rawTypeList_NoRawInstance.get(0); //  Generic type -Integer- instance compiled without error 

          Integer exampleRawInstance2   = (Integer)rawTypeList_RawInstance.get(0);      // ClassCastException as expected
          Integer exampleNoRawInstance2 = (Integer)rawTypeList_NoRawInstance.get(0);    // same here, logically
   }

}

谁能解释给我带来的不同,并给我带来一些可能的不同后果的例子吗?

1 个答案:

答案 0 :(得分:0)

泛型仅在编译时出现,编译器会将其删除(这称为类型擦除)。它们在那里是用于向编译器提供一些类型信息。这可以帮助您避免类型转换(与Java 1.5之前一样),并允许编译器进行更多类型检查。对于程序员来说,这也是宝贵的信息,例如,如果您在接口中看到通用类型。

没有泛型:

ArrayList list = new ArrayList();

因此,如果您写:

ArrayList</*Any type here*/> list = new ArrayList<>();

现在,编译器已掌握list中对象类型的信息。

但是,这与没有泛型的版本没有实质性的区别:

ArrayList list = new ArrayList</*Any type here*/>();

变量列表没有附带泛型信息,因此与没有泛型的版本一样好(或坏)。