我需要使用实现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中是不可能的。您只能在类型变量上放置一个边界。
Dart类型变量的边界用于检查您可以对类型参数类型的对象执行哪些操作。例:
String something<T extends num>(T value) {
return value.abs().toString();
}
你可以在abs()
上调用value
,因为我们知道value
的所有实例都是数字,而num
有abs
方法。
如果你可以编写<T extends Foo & Bar>
,那么Dart类型系统中没有简单的类型可以描述T
类型的对象。 Dart没有交集类型(交集类型Foo & Bar
将是所有类型的超类型,它们是Foo
和Bar
的子类型,以及Foo
和Bar
的子类型)。如果Foo
宣布Baz method()
,Bar
宣布Qux method()
,value
有T
类型,value.method()
的类型是什么? (它将被禁止,或类型将是Baz & Qux
)。这表明允许&
在类型变量边界中将交集类型泄漏到剩余的类型系统中,并且由于Dart没有交集类型,因此它在类型变量上也没有多个边界。
当你声明一个类FooBar
,实现Foo
和Bar
时,你有同样的问题:你需要弄清楚method
返回什么。但是,该语言要求您将该解决方案写入您的类,以便为FooBar.method
找到一些有效的返回类型,否则FooBar
类声明无效。它需要用户找到“找到Baz
和Qux
的子类”的解决方案。