飞镖多个上限

问题描述 投票:0回答:1

我需要使用实现3个接口的泛型来实现一个解决方案,但据我所知,dart中的泛型只支持1个上限?

我有一个看起来像这样的模型:

abstract class Category implements Built<Category, CategoryBuilder>, Identifiable, Mapable {
   ...
}

3个接口的内容并不真正相关,我正在尝试做的是构建一个可以通用形式处理它的类。

我想要的是这样的:

abstract class BaseDB<T extends Built<T, R> & Identifiable & Mapable, R extends Builder<T, R>> {
   process(T entity) {
      print(entity.id); // From Identifiable
      entity.toMap(); // From Mapable
      // ... etc
   }
}

我知道这可以在Typescript和Java中使用,但我在Dart上相当新。谁知道?

编辑,我应该提一下,不能为潜在的解决方案修改模型类。

dart
1个回答
2
投票

这在Dart中是不可能的。您只能在类型变量上放置一个边界。

Dart类型变量的边界用于检查您可以对类型参数类型的对象执行哪些操作。例:

String something<T extends num>(T value) {
  return value.abs().toString();
}

你可以在abs()上调用value,因为我们知道value的所有实例都是数字,而numabs方法。

如果你可以编写<T extends Foo & Bar>,那么Dart类型系统中没有简单的类型可以描述T类型的对象。 Dart没有交集类型(交集类型Foo & Bar将是所有类型的超类型,它们是FooBar的子类型,以及FooBar的子类型)。如果Foo宣布Baz method()Bar宣布Qux method()valueT类型,value.method()的类型是什么? (它将被禁止,或类型将是Baz & Qux)。这表明允许&在类型变量边界中将交集类型泄漏到剩余的类型系统中,并且由于Dart没有交集类型,因此它在类型变量上也没有多个边界。

当你声明一个类FooBar,实现FooBar时,你有同样的问题:你需要弄清楚method返回什么。但是,该语言要求您将该解决方案写入您的类,以便为FooBar.method找到一些有效的返回类型,否则FooBar类声明无效。它需要用户找到“找到BazQux的子类”的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.