gpt4 book ai didi

dart - 是否可以在 Dart 类上要求泛型类型参数?

转载 作者:IT老高 更新时间:2023-10-28 12:44:06 27 4
gpt4 key购买 nike

一个常见的问题,特别是自 Dart 2 以来,是否有可能要求一些或所有类型的一些或所有泛型类型参数 - 例如 List<int>而不是 ListMyType<Foo>而不是 MyType .

意图虽然并不总是很清楚 - 即这是一个风格问题(您/您的团队喜欢查看类型),以防止错误(省略类型参数似乎会导致更多您/您的团队的错误),或作为契约(Contract)问题(您的库期望类型参数)。

例如,在 dart-misc 上,用户写道:

基本上,如果我有这个:

abstract class Mixin<T> {}

I don't have to specify the type:

// Works class Cls extends Object with Mixin<int> {} // ...also works
class Cls extends Object with Mixin {}

Is there some way to make the second one not allowed?

最佳答案

严格来说,是的,不是。

如果您想强制在您自己的项目中始终使用类型参数(而不是依赖类型推断或默认值),您可以使用可选 linter rules such as always_specify_types .请注意这条规则违反了官方 Dart 风格指南的建议 AVOID redundant type arguments on generic invocations 在很多情况下。

如果您想强制通用类型参数总是使用when默认值会令人困惑 - 例如List隐含意义 List<dynamic>不存在这样的 lint - 尽管我们计划将其添加为分析器的 mode:https://github.com/dart-lang/sdk/issues/33119 .


以上两个建议都会对你自己有所帮助,但是如果你正在创建一个库供其他人使用,你可能会问你是否可以require 一个类型参数来使用你的类。例如,从上面:

abstract class Mixin<T> {}
abstract class Class extends Object with Mixin {}

您可以做的第一件事是为 T 添加一个默认边界。 :

// If T is omitted/not inferred, it defaults to num, not dynamic.
abstract class Mixin<T extends num> {}

如果你想允许任何东西,但又想让你的类/mixin 在 T 时难以使用是动态的,您可以选择不同的默认范围,例如 Object ,甚至更好I recommend void :

In practice, I use void to mean “anything and I don’t care about the elements”

abstract class Mixin<T extends void> {
T value;
}

class Class extends Mixin {}

void main() {
var c = Class();
// Compile-time error: 'oops' isn't defined for the class 'void'.
c.value.oops();
}

(您也可以使用 Object 来实现此目的)

如果这是您控制的类,您可以添加一个断言,以防止该类以您不支持或不期望的方式使用。例如:

class AlwaysSpecifyType<T> {
AlwaysSpecifyType() {
assert(T != dynamic);
}
}

最后,您可以编写自定义 lint 或工具来禁止省略某些泛型类型参数,但这可能是最大的工作量,如果之前的任何方法都适合您,我强烈推荐那些!

关于dart - 是否可以在 Dart 类上要求泛型类型参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52286139/

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