全部学科
Python全栈
python
NodeJS全栈
nodejs
📝 1 篇文章 20 道配套习题

泛型详解专题

专题说明

本专题系统讲解Java泛型的核心知识点,泛型是Java 5引入的特性,提供类型安全检查和代码复用能力,是Java集合框架和各类库的基础。

学习目标

  1. 掌握泛型类和泛型接口的定义与使用
  2. 理解泛型方法的定义与类型推断机制
  3. 掌握类型通配符(?、? extends、? super)的使用与PECS原则
  4. 理解类型擦除机制及其影响
  5. 掌握泛型与继承的不变性问题
  6. 了解通过反射获取泛型信息的方法
  7. 理解泛型数组的限制与替代方案

学习内容

本专题涵盖九大核心知识点:

知识点核心内容
泛型类类型参数定义、实例化语法
泛型接口接口定义、两种实现方式
泛型方法类型参数位置、类型推断
类型通配符上界通配符、下界通配符、PECS原则
类型擦除擦除机制、桥接方法、运行时限制
泛型与继承不变性、协变与逆变概念
泛型与反射ParameterizedType、获取泛型信息
泛型与数组禁止创建泛型数组、替代方案
泛型最佳实践原始类型、类型参数命名

学习建议

  1. 理解类型擦除:泛型本质是编译时特性,运行时类型信息被擦除
  2. 掌握PECS原则:生产者用extends,消费者用super,这是通配符使用的核心
  3. 区分泛型类与方法:泛型类的类型参数在整个类有效,泛型方法的类型参数只在方法内有效
  4. 注意不变性:List不是List的子类型,这是泛型的重要限制

📝 配套习题(20 题)

💡 参考答案在文末
判断题
1

由于类型擦除,在运行时完全无法获取任何泛型类型信息。

A

B

2

Java禁止创建泛型数组,但也禁止声明泛型数组类型的变量。

A

B

3

Field.getType()和Field.getGenericType()返回结果相同,因为泛型信息在运行时被擦除。

A

B

4

一个类实现泛型接口时,既可以指定具体类型,也可以保留泛型参数成为泛型类。

A

B

单选题
5

以下代码的执行结果是什么?

Java
public static <T> T first(List<T> list) {
    return list.get(0);
}
List<String> strings = Arrays.asList("a", "b", "c");
String result = first(strings);
A

编译错误,需要显式指定类型参数

B

编译成功,编译器推断T为String

C

编译成功,返回Object类型需要强转

D

运行时抛出ClassCastException

6

以下哪种方式可以创建泛型数组?

A

new T[10]

B

new List[10]

C

(T[]) new Object[10]

D

以上都不可以

7

为什么Java数组是协变的,而泛型是不变的?

A

数组更高级,泛型设计有缺陷

B

数组早期设计为了灵活性,泛型设计为了类型安全

C

数组运行时检查类型,泛型编译时检查类型

D

以上都是正确的原因

8

PECS原则的含义是什么?

A

Producer Extends Consumer Super - 生产者用extends,消费者用super

B

Producer Super Consumer Extends - 生产者用super,消费者用extends

C

Private Extends Public Super - 私有继承公有

D

Parameter Extends Class Super - 参数继承类

9

关于泛型类的定义,以下哪个是正确的语法?

A

public class Box { private T value; }

B

public class Box<T, V> { private T value; }

C

public class Box { private type value; }

D

public class Box { private T value; }

10

Java泛型的类型擦除机制是什么?

A

编译时擦除类型参数,运行时保留泛型信息

B

编译时擦除类型参数,运行时泛型信息被替换为边界类型或Object

C

运行时擦除类型参数,编译时保留泛型信息

D

泛型信息不会被擦除,一直保留到运行时

11

关于泛型方法,以下说法正确的是:

A

泛型方法只能定义在泛型类中

B

泛型方法的类型参数声明必须在返回值类型之前

C

泛型方法的类型参数与泛型类的类型参数是同一个

D

泛型方法不能使用静态修饰符

12

泛型类有两个类型参数时,应该使用什么命名?

A

T1和T2

B

T和S

C

K和V(如果表示键值)

D

以上都可以,但K和V更符合约定(键值场景)

13

泛型类本身可以继承其他类吗?

A

泛型类不能继承其他类

B

泛型类可以继承普通类或泛型类

C

泛型类只能继承泛型类

D

泛型类只能继承普通类

14

如何通过反射获取方法参数的泛型类型?

A

method.getParameterTypes()

B

method.getGenericParameterTypes()

C

method.getReturnType()

D

method.getTypeParameters()

15

关于泛型接口,以下说法正确的是:

A

实现泛型接口时必须指定具体类型

B

实现泛型接口时可以保留类型参数,创建泛型实现类

C

泛型接口不能有多个类型参数

D

泛型接口的方法不能使用接口的类型参数

多选题
16

关于泛型通配符的限制,以下说法正确的有哪些?

A
B
C
D
17

以下哪个赋值语句是正确的?

A

List list = new ArrayList();

B

List list = new ArrayList();

C

List list = new ArrayList();

D

Object[] array = new String[10]; // 这行正确,但List list = new ArrayList()不正确

填空题
18

Java泛型类常用的类型参数命名约定:____________表示任意类型,____________表示集合元素类型,____________表示键类型,V表示值类型,N表示数值类型。

19

泛型最佳实践的核心原则:避免使用____________;使用____________原则选择通配符;优先使用____________而非泛型类;确认类型安全后使用@SuppressWarnings消除警告。

20

泛型方法的类型参数声明必须在____________之前,语法格式为:____________

参考答案
1.错误 2.错误 3.错误 4.正确 5.B 6.C 7.D 8.A 9.A 10.B 11.B 12.D 13.B 14.B 15.B 16.A;B;C;D 17.C;D 18.T;E;K 19.原始类型;PECS;泛型方法 20.返回值类型;修饰符 <类型参数> 返回值类型 方法名(参数列表)
想在手机上练习这套专题?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码
← 上一个专题 数组与方法专题
下一个专题 → 线程安全与同步机制专题
扫码体验小程序
加载中
想在手机上刷题学习?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码