Java:在Type和Implementation上指定泛型

Cog*_*gsy 1 java generics

我见过的大多数引用,以及我的IDE的代码完成都在我的变量类型及其实现上指定了Generic类型,例如.

List<String> string = new ArrayList<String>();
Run Code Online (Sandbox Code Playgroud)

最近我开始在实现中跳过泛型类型,例如.

List<String> strings = new ArrayList();
Run Code Online (Sandbox Code Playgroud)

假设编译器只检查它的spiffy泛型voodoo的类型,并且实现不应该关心,因为它的泛型类型在编译时被擦除,并且根本不应影响运行时.

我天真吗?是否有理由在实现中包含泛型类型?

Ita*_*man 6

编译器可能允许您编写具有此类分配的代码(取决于您的警告/错误设置),但它是不安全的.这是一个例子:

List<Date> dates = new ArrayList<Date>();
List list = dates;
List<String> strings = list;

strings.add("a");
Date d = dates.get(0); // Boom!!
Run Code Online (Sandbox Code Playgroud)