[英]Dart: Is it possible to pass a generic type to a class as a variable?
[英]Is it possible to require generic type arguments on a Dart class?
一个常见的问题,特别是自Dart 2以来,是否可能在某些或所有类型上需要一些或所有泛型类型参数 - 例如List<int>
而不是List
或MyType<Foo>
而不是MyType
。
虽然目的并不总是清楚 - 即这是一种风格问题(你/你的团队喜欢看到类型),防止错误(省略类型参数似乎会给你/你的团队带来更多错误),或者契约问题(你的库需要一个类型参数)。
例如,在dart-misc
,用户写道:
基本上,如果我有这个:
abstract class Mixin<T> {}
我没有指定类型:
// Works class Cls extends Object with Mixin<int> {} // ...also works class Cls extends Object with Mixin {}
有没有办法让第二个不被允许?
严格地说,是的,没有。
如果要强制执行该类型参数始终在您自己的项目中使用(而不是依赖于类型推断或默认值),则可以使用可选的 always_specify_types
规则,例如always_specify_types
。 请注意,在许多情况下,此规则违反了官方Dart样式指南AVOID redundant type arguments on generic invocations
的AVOID redundant type arguments on generic invocations
的建议。
如果要强制执行泛型类型参数总是使用时默认会让人混淆-如List
隐含意思List<dynamic>
,没有这样的皮棉还不存在-虽然我们计划将这个作为分析仪的模式 : HTTPS: //github.com/dart-lang/sdk/issues/33119 。
上述两个建议都会对您自己有所帮助,但如果您要创建一个供其他人使用的库,您可能会问是否可以要求使用类型参数来使用您的类。 例如,从上面:
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
,或者甚至更好我推荐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或工具来禁止忽略某些泛型类型参数,但这可能是最多的工作量,如果以前的任何方法都适合您,我强烈推荐这些!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.