gpt4 book ai didi

Dart 多个上限

转载 作者:行者123 更新时间:2023-12-03 04:16:30 25 4
gpt4 key购买 nike

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

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

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

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

我想要的是这样的:

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 类型变量的绑定(bind)用于检查您可以对类型参数类型的对象执行哪些操作。示例:

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 将是所有类型的父类(super class)型,这些类型既是 FooBar 的子类型,也是 FooBar 的子类型)。如果 Foo 声明 Baz method()Bar 声明 Qux method() ,并且 value 的类型为 T ,那么 value.method() 的类型是什么?(它要么被禁止,要么类型为 Baz & Qux )。这表明在类型变量边界中允许 & 会将交集类型泄漏到剩余的类型系统中,并且由于 Dart 没有交集类型,因此它在类型变量上也没有多个边界。

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

关于Dart 多个上限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55924830/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com