首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何为Dart静态扩展指定泛型类型?

为Dart静态扩展指定泛型类型可以通过使用扩展方法和泛型约束来实现。下面是一个示例:

代码语言:txt
复制
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作为泛型约束:

代码语言:txt
复制
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的扩展方法是在编译时静态解析的,因此无法在运行时动态指定泛型类型。扩展方法的泛型类型参数在定义时就需要确定。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券