测试说明
本测试包含10道选择题,涵盖Java泛型的核心概念,包括泛型类、泛型方法、通配符、有界类型参数、类型擦除和PECS原则等知识点。
以下哪个不是Java泛型的主要优势?
-
A
提供编译时类型安全检查
-
B
消除类型转换
-
C
提高运行时性能
-
D
增加运行时类型信息
解析
正确答案是D。由于类型擦除机制,Java泛型在运行时会丢失类型信息,而不是增加运行时类型信息。泛型的主要优势包括编译时类型安全、消除类型转换、提高代码重用性等。
以下哪个是正确的泛型类定义?
-
A
public class Container<T> { }
-
B
public class <T> Container { }
-
C
public <T> class Container { }
-
D
public class Container(T) { }
解析
正确答案是A。泛型类的类型参数应该在类名后面用尖括号声明,格式为:class ClassName<TypeParameter>
。
以下哪个是正确的泛型方法定义?
public static _____ void swap(T[] array, int i, int j) {
T temp = array[i];
array[i] = array[j];
array[j] = temp;
}
解析
正确答案是A。泛型方法的类型参数必须在返回类型前用尖括号声明,格式为:<TypeParameter> ReturnType methodName(...)
。
根据PECS原则,以下哪个声明适合用于只读取数据的方法参数?
-
A
List<? super Number>
-
B
List<? extends Number>
-
C
List<?>
-
D
List<Number>
解析
正确答案是B。PECS原则:Producer Extends, Consumer Super。当方法只读取数据时(生产者),应使用? extends T
上界通配符。
以下哪个有界类型参数的声明是正确的?
-
A
<T extends Number & Comparable<T>>
-
B
<T extends Number, Comparable<T>>
-
C
<T extends Number + Comparable<T>>
-
D
<T extends Number | Comparable<T>>
解析
正确答案是A。多重边界使用&符号连接,格式为:<T extends Class & Interface1 & Interface2>
。类必须在接口之前。
由于类型擦除,以下哪个操作在Java中是不允许的?
-
A
List<String> list = new ArrayList<>();
-
B
new T[10]
(在泛型类中)
-
C
List<Integer> intList = new ArrayList<>();
-
D
Container<String> container = new Container<>();
解析
正确答案是B。由于类型擦除,运行时无法确定T的具体类型,因此不能创建泛型数组new T[10]
。这会导致编译错误。
以下哪个方法签名适合用于向集合中添加元素?
-
A
void addNumbers(List<? extends Number> list)
-
B
void addNumbers(List<? super Integer> list)
-
C
void addNumbers(List<?> list)
-
D
void addNumbers(List list)
解析
正确答案是B。根据PECS原则,当需要向集合中写入数据时(消费者),应使用? super T
下界通配符。这样可以安全地添加Integer及其子类型。
以下代码的运行结果是什么?
List<String> stringList = new ArrayList<>();
List<Integer> integerList = new ArrayList<>();
System.out.println(stringList.getClass() == integerList.getClass());
-
A
true
-
B
false
-
C
编译错误
-
D
运行时异常
解析
正确答案是A。由于类型擦除,运行时两个List的Class对象都是ArrayList.class,所以比较结果为true。泛型信息在运行时被擦除。
以下关于泛型继承的说法,哪个是正确的?
-
A
List<String>
是List<Object>
的子类型
-
B
List<Object>
是List<String>
的子类型
-
C
List<String>
和List<Object>
没有继承关系
-
D
List<String>
和List<Object>
是同一类型
解析
正确答案是C。泛型是不变的(invariant),即使String是Object的子类,List<String>
和List<Object>
之间也没有继承关系。这是为了保证类型安全。
以下哪个是泛型使用的最佳实践?
-
A
总是使用原始类型以保持向后兼容
-
B
忽略编译器的泛型警告
-
C
优先使用泛型而不是原始类型
-
D
在所有地方都使用无界通配符
解析
正确答案是C。泛型的最佳实践包括:优先使用泛型而不是原始类型、不要忽略编译器警告、遵循PECS原则、使用有界类型参数等。