温馨提示×

温馨提示×

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

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

泛型如何约束类型

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

在**泛型(Generics)**中,“约束类型”指的是:限制泛型参数可以接受哪些类型,而不是任意类型。不同语言语法不同,但核心思想一致。下面以 Java、C#、TypeScript 为例说明。


一、为什么需要约束泛型?

<T> void print(T t) {
    // 只能把它当 Object 用
}

如果不约束:

  • 无法调用特定方法
  • 无法保证类型安全

约束后:

  • 可以使用某些方法
  • 编译器能帮你检查错误

二、Java 中的泛型约束

1️⃣ 上界约束(最常见)

<T extends Number>

✅ 表示:T 必须是 Number 或其子类

public <T extends Number> double add(T a, T b) {
    return a.doubleValue() + b.doubleValue();
}

✔ 可以调用 Number 的方法
❌ 不能传 String


2️⃣ 多重约束(Java 不支持多继承,但可加接口)

<T extends Number & Comparable<T>>
public <T extends Number & Comparable<T>> T max(T a, T b) {
    return a.compareTo(b) > 0 ? a : b;
}

3️⃣ 泛型类约束

class Box<T extends Number> {
    T value;
}

三、C# 中的泛型约束

1️⃣ 常见约束关键字

where T : class        // 引用类型
where T : struct       // 值类型
where T : new()        // 无参构造函数
where T : BaseClass
where T : IInterface

2️⃣ 示例

public class Repository<T> where T : class, new()
{
    public T Create()
    {
        return new T();
    }
}

3️⃣ 多个约束

public void Print<T>(T obj)
    where T : class, IFormattable
{
    Console.WriteLine(obj.ToString());
}

四、TypeScript 中的泛型约束

1️⃣ extends 约束

function printLength<T extends { length: number }>(arg: T): void {
    console.log(arg.length);
}

✅ 只能传有 length 属性的类型

printLength("hello");
printLength([1, 2, 3]);

printLength(123); // 报错

2️⃣ 约束为某个类型

interface HasId {
    id: number;
}

function getId<T extends HasId>(obj: T): number {
    return obj.id;
}

3️⃣ keyof 约束(非常常见)

function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
    return obj[key];
}

五、对比总结

语言 约束方式 示例
Java T extends Type <T extends Number>
C# where T : Type where T : class
TS T extends Type <T extends Interface>

六、一句话总结

泛型约束的本质是:告诉编译器“这个类型至少长什么样”,从而安全地使用它的能力。

如果你愿意,我可以:

  • 一个真实业务例子讲泛型约束
  • 对比 泛型约束 vs 无约束的性能/安全差异
  • 协变 / 逆变(高级)
向AI问一下细节

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

AI