飞镖多个上限

时间:2019-04-30 16:02:34

标签: dart

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

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

try:
    somecode()
except Exception as e:
    do_something_with_exception(e)
except SystemExit as x:
    do_something_not_exit(x)

这3个接口的内容并没有真正的相关性,我想做的是构造一个可以以通用形式处理该类的类。

我想要的是这样的

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

我知道这在Typescript和Java中都是可行的,但是我在Dart还是很新的。有人知道吗?

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

1 个答案:

答案 0 :(得分:2)

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

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

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

您可以在abs()上调用value,因为我们知道value的所有实例都是数字,并且num具有abs方法。 / p>

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

在声明实现FooBarFoo的类Bar时,您会遇到相同的问题:您需要弄清楚method返回的内容。但是,语言需要将您的解决方案到您的类中,以找到FooBar.method的有效返回类型,因为否则FooBar类声明无效。它要求用户找到一种解决方案,以“找到BazQux的子类”。