泛型

2018-05-03 13:57 更新

笔者能力有限,总结有误的地方,请读者协作更正。

1.Java中的泛型是什么?使用泛型的好处?

在集合中存储对象,并在使用前进行类型转换很不方便;java1.5开始提供了泛型。 作用:在编译期进行类型转换,把正确的类型对象放在入集合中,避免出现类型转换异常。

2.泛型是如何工作的?什么是类型擦除?

泛型是通过类型擦除来实现的,编译器在编译的时候会擦除所有类型的相关信息,所有在运行的时候不存在任何类型转换。例如:定义两个数组,Arraylist<String>,ArrayList<Integer>,我们用getClass()获取类的信息,返回结果都为true,说明类型在编译的时候被擦除。

为什么泛型用类型擦除来实现? 因为泛型能保证,我们只需要定义一次类,就可以被任何数据类型使用,而不是一种数据类型定义一个类; 泛型只能保存我们使用的数据类型,而不是一堆的Object;

3.什么是泛型中的限定通配符?和非限定通配符?

限定通配符对类进行限制:

4.如何编写一个泛型方法,让它能接受泛型参数并返回泛型类型?

使用T, E or K,V等被广泛认可的类型占位符;最简单的情况下,一个泛型方法可能会像这样:

5.你可以把List<String>传递给一个接受List<Object>参数的方法吗?

String是一种Object,看起来可以传递,实际不可以;因为List<String>是自定义泛型的,只能用来存储String; List<Object>可以用来存储所有数据类型。

6.Array可以用泛型么?

Array事实上并不支持泛型; Java一书中建议使用List来代替Array,因为List可以提供编译期的类型安全保证,而Array却不能。

7.如何阻止java中的“类型检查”错误?

原因:把泛型和原始数据类型混合使用,编译时会出现该错误。例如: List<String> rawList = new ArrayList()

8.是否可以使用Object代替通配符“?”使用?

List<?> 是一个未知类型的List,而List<Object> 其实是任意类型的List。 可以把List<String>, List<Integer>赋值给List<?>, 却不能把List<String>赋值给 List<Object>。     

9.Java中List<Object>和原始类型的List的区别?

在编译时编译器不会对原始类型进行类型安全检查,却会对带参数的类型进行检查,通过使用Object作为类型,可以告知编译器该方法可以接受任何类型的对象,比如String或Integer。

原始类型List可以存任何数据类型,但却不能把List<String>传递给接受 List<Object>的方法,即指定泛型的List不能传给Object; 因为会产生编译错误。

10.List<String>和原始类型List之间的区别?

带参数类型是类型安全的,由编译器保证的,但原始类型List却不是类型安全 的。 原始类型List可以存任何数据类型,List<String>只能存String类型

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号