严格来说,有,也没有。
如果您想强制在您自己的项目中始终使用类型参数(而不是依赖类型推断或默认值),您可以使用可选 的 linter 规则,例如always_specify_types. AVOID redundant type arguments on generic invocations请注意,此规则在许多情况下违反了官方 Dart 样式指南的建议。
如果您想强制在默认值令人困惑时始终使用泛型类型参数- 例如隐含含义,尚不存在这样的 lint - 尽管我们计划将其添加为分析器的模式: https ://github.com /dart-lang/sdk/issues/33119。ListList<dynamic>
以上两个建议都会对您自己有所帮助,但是如果您正在创建一个库供其他人使用,您可能会问是否可以要求类型参数来使用您的类。例如,从上面:
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,甚至更好,我建议void:
在实践中,我习惯于void表示“任何事情,我不关心元素”
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 或工具来禁止省略某些泛型类型参数,但这可能是最大的工作量,如果前面的任何方法对您有用,我强烈推荐这些方法!