java 泛型面试题
时间: 2025-02-25 11:08:58 浏览: 39
### Java 泛型面试题及解答
#### 1. 编译器要将泛型擦除,为什么还需要使用泛型?
尽管编译器会执行类型擦除操作,即在运行时移除所有的泛型信息并替换为 `Object` 类型,但这并不意味着可以简单地用 `Object` 来替代泛型。泛型的主要优势在于提供更强的类型安全性和更好的可读性。
- **类型安全性**:泛型可以在编译期捕获类型错误,减少运行时异常的发生。例如,在不使用泛型的情况下,向集合中添加不同类型对象不会引发任何警告;而在使用泛型后,则会在尝试插入不符合类型的元素时报错[^1]。
- **代码简洁度与易维护性**:利用泛型可以使代码更加通用化和模块化,从而提高开发效率以及降低后期维护成本。比如定义一个工具函数处理多种数据结构而不必针对每种情况单独编写版本。
```java
// 使用 Object 的例子
List list = new ArrayList();
list.add("string");
String s = (String) list.get(0); // 这里可能会抛出 ClassCastException 异常
// 使用泛型的例子
List<String> stringList = new ArrayList<>();
stringList.add("string");
String str = stringList.get(0); // 不需要强制转换, 更加安全可靠
```
#### 2. 如何理解Java中的通配符?
Java 中引入了两种主要形式的通配符——无界通配符 (`?`) 和有界通配符 (`<? extends T>` 或 `<? super T>`):
- **无界通配符**:表示未知的具体类型,通常用于只读场景下声明容器变量;
- **上界通配符**:指定某个特定父类及其子类作为实际参数类型范围;
- **下界通配符**:限定具体类型必须是给定类或其祖先之一。
这些机制使得我们可以写出更灵活且健壮的应用程序逻辑,同时也增强了 API 设计上的表达能力。
```java
public static void printCollection(Collection<?> c){
for(Object e : c){
System.out.print(e + " ");
}
}
```
#### 3. 泛型方法如何定义?
除了类级别的泛型外,还可以创建独立于实例存在的静态成员方法,并为其赋予自己的类型形参列表。这被称为“泛型方法”。语法如下所示:
```java
<T> 返回值类型 方法名(参数列表);
```
其中 `<T>` 表明这是一个带有单个类型参数的方法签名。如果存在多个这样的占位符,则它们之间需要用逗号分隔开。
下面是一个简单的示例展示了如何实现一个接受任意两个同质元素并返回较大者比较器接口实现方式:
```java
public class Util {
public static <T extends Comparable<T>> T max(T a, T b){
return a.compareTo(b)>0 ? a:b;
}
}
// 调用此方法的方式如下:
Integer m = Util.max(5, 9);
Double n = Util.max(3.14, 2.718);
```
以上就是一些常见的有关 Java 泛型方面的知识点总结,希望对你有所帮助!
阅读全文
相关推荐
















