泛型(Generics)是在定义类、接口或方法时使用“类型参数”,让代码可以适用于多种数据类型,同时保证编译期类型安全。不同语言语法略有差异,下面以 Java 为主说明,并简单对比 C# / TypeScript / C++。
List list = new ArrayList();
list.add("hello");
list.add(123); // 编译不报错
String s = (String) list.get(1); // 运行时异常
List<String> list = new ArrayList<>();
list.add("hello");
// list.add(123); // 编译期直接报错
String s = list.get(0); // 不需要强制转换
✅ 类型安全
✅ 代码更通用
✅ 减少强制类型转换
class Box<T> {
private T value;
public void set(T value) {
this.value = value;
}
public T get() {
return value;
}
}
使用:
Box<String> box = new Box<>();
box.set("hello");
String s = box.get();
interface Converter<T, R> {
R convert(T t);
}
实现:
class StringToIntConverter implements Converter<String, Integer> {
public Integer convert(String s) {
return Integer.parseInt(s);
}
}
public <T> T getFirst(T[] array) {
return array[0];
}
调用:
String[] arr = {"a", "b"};
String first = getFirst(arr);
? 无界通配符List<?> list;
表示:某个未知类型
? extends T(上界)List<? extends Number> list;
✅ 可以读
❌ 不能写(除了 null)
Number n = list.get(0);
? super T(下界)List<? super Integer> list;
✅ 可以写 Integer
❌ 读出来是 Object
list.add(1);
new T()int)Box<int> b; // ❌
Box<Integer> b; // ✅
class Box<T> {
public T Value { get; set; }
}
function identity<T>(arg: T): T {
return arg;
}
template<typename T>
T add(T a, T b) {
return a + b;
}
✅ 想写通用、可复用的代码
✅ 需要类型安全
✅ 容器类、工具类、接口设计
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。