ClassCastException
。<T>
,T
为占位符类型。 <JAVA>
public class Box<T> {
private T content;
public void set(T content) { this.content = content; }
public T get() { return content; }
}
<JAVA>
public <T> void printArray(T[] array) {
for (T element : array) {
System.out.print(element + " ");
}
}
?
<? extends T>
:接受T
及其子类。 <JAVA>
// 接受Number或其子类(如Integer/Double)的列表
public void process(List<? extends Number> list) { /* ... */ }
<? super T>
:接受T
及其父类。 <JAVA>
// 接受Integer或其父类(如Number/Object)的列表
public void addNumbers(List<? super Integer> list) { list.add(42); }
Object
或上界类型),并在必要时插入类型转换。
<JAVA>
// 源码
List<String> list = new ArrayList<>();
String s = list.get(0);
// 编译后的等效代码(类型擦除)
List list = new ArrayList(); // 类型擦除为原始类型List
String s = (String) list.get(0); // 插入强制转换
<JAVA>
List<String> names = new ArrayList<>(); // 安全存储字符串
Map<Integer, String> idToName = new HashMap<>();
<JAVA>
public static <T> T getFirst(List<T> list) {
return list.isEmpty() ? null : list.get(0);
}
<JAVA>
public interface Callback<T> {
void onSuccess(T result);
void onFailure(String error);
}
ParameterizedType
): <JAVA>
Type type = new TypeToken<List<String>>(){}.getType(); // Guava库常用
类型参数不能是基本类型:
<JAVA>
// 错误示例
List<int> list = new ArrayList<>(); // 需使用包装类Integer
无法实例化泛型类型:
<JAVA>
T instance = new T(); // 编译错误
静态成员不能使用类型参数:
<JAVA>
class Box<T> {
// static T data; // 错误
}
泛型数组的限制:
<JAVA>
// 不能直接创建泛型数组
// T[] array = new T[10]; // 错误
// 可通过反射或强制类型转换实现(存在风险)
T[] array = (T[]) new Object[10];
泛型与异常:
Throwable
。<JAVA>
public class Node<T extends Comparable<T>> {
// T必须实现Comparable<T>接口
}
<JAVA>
List<String> list = Collections.emptyList(); // Java 7+可推断为List<String>
如何获取泛型的实际类型?
TypeToken
(Guava库)或反射捕获类型: <JAVA>
Type type = ((ParameterizedType) getClass().getGenericSuperclass())
.getActualTypeArguments()[0];
何时使用List
和List<?>
?
List
:原始类型(存在类型不安全警告)。List<?>
:未知类型的集合(只能读取为Object
,不能添加元素)。泛型是Java类型系统的核心机制,通过合理使用可大幅提升代码的安全性和可维护性。重点需掌握:
版权说明:如非注明,本站文章均为 扬州驻场服务-网络设备调试-监控维修-南京泽同信息科技有限公司 原创,转载请注明出处和附带本文链接。
请在这里放置你的在线分享代码