严格来说,是的,和不是。
如果您想强制在您自己的项目中始终使用类型参数(而不是依赖类型推断或默认值),您可以使用 optional linter rules such as always_specify_types .请注意,此规则在许多情况下违反了官方 Dart 样式指南的建议 AVOID redundant type arguments on generic invocations。
如果你想强制 generic 类型参数 always 使用 when 默认值会令人困惑 - 例如 List 隐含意思List<dynamic>,尚不存在这样的 lint - 尽管我们计划将其添加为分析器的 模式: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> {}
如果你想允许任何东西,但又想在T 是动态的时候难以使用你的类/mixin,你可以选择不同的默认绑定,例如Object,甚至更好I recommend 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 或工具来禁止省略某些泛型类型参数,但这可能是最大的工作量,如果前面的任何方法都适合您,我强烈推荐那些!