我最近开始从基础开始学习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
}
}
谁能解释给我带来的不同,并给我带来一些可能的不同后果的例子吗?
答案 0 :(得分:0)
泛型仅在编译时出现,编译器会将其删除(这称为类型擦除)。它们在那里是用于向编译器提供一些类型信息。这可以帮助您避免类型转换(与Java 1.5之前一样),并允许编译器进行更多类型检查。对于程序员来说,这也是宝贵的信息,例如,如果您在接口中看到通用类型。
没有泛型:
ArrayList list = new ArrayList();
因此,如果您写:
ArrayList</*Any type here*/> list = new ArrayList<>();
现在,编译器已掌握list
中对象类型的信息。
但是,这与没有泛型的版本没有实质性的区别:
ArrayList list = new ArrayList</*Any type here*/>();
变量列表没有附带泛型信息,因此与没有泛型的版本一样好(或坏)。