温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

泛型如何定义使用

发布时间:2026-07-15 12:52:06 来源:亿速云 阅读:88 作者:小樊 栏目:编程语言

泛型(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); // 不需要强制转换

类型安全
代码更通用
减少强制类型转换


二、泛型的基本定义(Java)

1️⃣ 泛型类

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();

2️⃣ 泛型接口

interface Converter<T, R> {
    R convert(T t);
}

实现:

class StringToIntConverter implements Converter<String, Integer> {
    public Integer convert(String s) {
        return Integer.parseInt(s);
    }
}

3️⃣ 泛型方法

public <T> T getFirst(T[] array) {
    return array[0];
}

调用:

String[] arr = {"a", "b"};
String first = getFirst(arr);

三、泛型通配符(Java 特有)

1️⃣ ? 无界通配符

List<?> list;

表示:某个未知类型


2️⃣ ? extends T(上界)

List<? extends Number> list;

✅ 可以读
❌ 不能写(除了 null

Number n = list.get(0);

3️⃣ ? super T(下界)

List<? super Integer> list;

✅ 可以写 Integer
❌ 读出来是 Object

list.add(1);

四、泛型常见约束

Java 泛型特点

  • 编译期生效(类型擦除)
  • 不能 new T()
  • 不能用基本类型(如 int
Box<int> b; // ❌
Box<Integer> b; // ✅

五、其他语言对比

C#

class Box<T> {
    public T Value { get; set; }
}

TypeScript

function identity<T>(arg: T): T {
    return arg;
}

C++(模板)

template<typename T>
T add(T a, T b) {
    return a + b;
}

六、什么时候用泛型?

✅ 想写通用、可复用的代码
✅ 需要类型安全
✅ 容器类、工具类、接口设计


如果你愿意,我可以:

  • 你正在学的语言 详细讲
  • 真实项目例子
  • 泛型 + 集合 + 设计模式 组合用法
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI