为Dart静态扩展指定泛型类型可以通过使用扩展方法和泛型约束来实现。下面是一个示例:
extension ListExtension<T> on List<T> {
List<T> filter(bool Function(T) test) {
var result = <T>[];
for (var item in this) {
if (test(item)) {
result.add(item);
}
}
return result;
}
}
void main() {
var numbers = [1, 2, 3, 4, 5];
var evenNumbers = numbers.filter((n) => n % 2 == 0);
print(evenNumbers); // 输出 [2, 4]
}
在上面的示例中,我们使用了扩展方法来为List
类型添加了一个filter
方法。该方法接受一个函数作为参数,并返回一个新的列表,其中包含满足条件的元素。通过在扩展方法定义时使用泛型类型参数<T>
,我们可以在方法体内使用泛型类型T
。
在使用扩展方法时,可以直接调用该方法来对列表进行过滤操作,无需创建新的工具类或修改原始类的定义。
对于泛型类型的约束,可以使用where
关键字来指定。例如,如果我们只想为数字类型的列表添加filter
方法,可以使用num
作为泛型约束:
extension NumberListExtension<T extends num> on List<T> {
List<T> filter(bool Function(T) test) {
var result = <T>[];
for (var item in this) {
if (test(item)) {
result.add(item);
}
}
return result;
}
}
void main() {
var numbers = [1, 2, 3, 4, 5];
var evenNumbers = numbers.filter((n) => n % 2 == 0);
print(evenNumbers); // 输出 [2, 4]
var strings = ['hello', 'world'];
// strings.filter((s) => s.length > 3); // 编译错误,String不满足泛型约束
}
在上面的示例中,我们使用extends
关键字将泛型类型T
约束为num
,这意味着只有数字类型的列表才能使用该扩展方法。
需要注意的是,Dart的扩展方法是在编译时静态解析的,因此无法在运行时动态指定泛型类型。扩展方法的泛型类型参数在定义时就需要确定。
领取专属 10元无门槛券
手把手带您无忧上云