整体上与Java的泛型相似,有少许区别
运行时持有类型信息
Java的泛型的类型信息在运行时会丢弃,Dart则一直保持到运行时,可以动态check泛型信息
final strList = <String>[
"hoge", "fuga", "moge"
];
assert(strList is List<String>);
泛型上界
- 跟Java一样,
<T extends S>
约定泛型T的上界S,但是不能通过super
关键字约束下届。 - Java可以使用
<T extends A & B & C>
约定多个上界,但在Dart中不允许。 - 定义上界时,调用时可以省略泛型书写,如下
class Foo<T extends SomeBaseClass> { }
var foo = Foo();
print(foo); // Instance of 'Foo<SomeBaseClass>'
方法泛型
与Java的写法不同
// 泛型的定义在方法名和参数之间
// Java是写在返回值前面
T doHoge<T>(T value){ ... }
Dart2之前只有成员方法才能使用泛型,Dart2中普通的顶级函数也可以使用泛型