繁体   English   中英

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

[英]Is it possible to require generic type arguments on a Dart class?

一个常见的问题,特别是自Dart 2以来,是否可能在某些或所有类型上需要一些或所有泛型类型参数 - 例如List<int>而不是ListMyType<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 invocationsAVOID 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM