在**泛型(Generics)**中,“约束类型”指的是:限制泛型参数可以接受哪些类型,而不是任意类型。不同语言语法不同,但核心思想一致。下面以 Java、C#、TypeScript 为例说明。
<T> void print(T t) {
// 只能把它当 Object 用
}
如果不约束:
约束后:
<T extends Number>
✅ 表示:T 必须是 Number 或其子类
public <T extends Number> double add(T a, T b) {
return a.doubleValue() + b.doubleValue();
}
✔ 可以调用 Number 的方法
❌ 不能传 String
<T extends Number & Comparable<T>>
public <T extends Number & Comparable<T>> T max(T a, T b) {
return a.compareTo(b) > 0 ? a : b;
}
class Box<T extends Number> {
T value;
}
where T : class // 引用类型
where T : struct // 值类型
where T : new() // 无参构造函数
where T : BaseClass
where T : IInterface
public class Repository<T> where T : class, new()
{
public T Create()
{
return new T();
}
}
public void Print<T>(T obj)
where T : class, IFormattable
{
Console.WriteLine(obj.ToString());
}
extends 约束function printLength<T extends { length: number }>(arg: T): void {
console.log(arg.length);
}
✅ 只能传有 length 属性的类型
printLength("hello");
printLength([1, 2, 3]);
❌
printLength(123); // 报错
interface HasId {
id: number;
}
function getId<T extends HasId>(obj: T): number {
return obj.id;
}
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> |
泛型约束的本质是:告诉编译器“这个类型至少长什么样”,从而安全地使用它的能力。
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。