【问题标题】:How to ensure type in a generic implements some operators in Dart?如何确保泛型中的类型在 Dart 中实现了一些运算符?
【发布时间】:2013-08-31 17:21:13
【问题描述】:

我想构建一个包含T 类型对象的泛型类。包含类必须对这些对象执行一些运算符,特别是像+-*/ 这样的运算符。如何确保对象的类型实现了这些运算符?

具体来说,我正在实现一个矩阵类,就像在数学矩阵中一样。我本来可以只允许 double 元素,但我还希望能够制作自定义数字类的矩阵,例如有理数或复数(这是更大项目的一部分)。

我当前的实现有签名

class Matrix<T extends MatrixElement> {
  final int _rows;          // The number of rows
  final int _cols;          // The number of columns
  ...
  final List<T> _elements;  // Matrix data, [i*step+j] is row i, col j.

MatrixElement 是一个抽象类,带有类似的运算符

dynamic operator + (dynamic other);

我本可以将 Matrix 类更改为简单的 class Matrix&lt;T&gt; { ... },但随后可能会在运行时出现错误,并且 Dart 编辑器中充满了关于未为类 Object 定义运算符的警告。

我的直觉说是class Matrix&lt;T implements MatrixElement&gt; { ... },但Dart 似乎不支持这一点。

【问题讨论】:

    标签: generics dart


    【解决方案1】:

    我认为您能做的最好的事情就是假设元素具有这些方法,并使类型参数不受限制。这将消除警告,尽管当您希望类型系统帮助您时可能有点不满意。

    联合类型会有所帮助,因此您可以为以下错误加注星标:http://dartbug.com/4938

    【讨论】:

    • 谢谢!我在问题中调整了我的表述,因为我的意思是说,如果我没有为 T 指定任何类型来扩展(使其不受限制),就会出现警告(这是我最初尝试的,在添加 extends MatrixElement 部分之前)。
    • 接受您的回答,因为它可能是最好的答案。去年写了 Go,我很怀念 Go 如何使用接口来处理类型。
    【解决方案2】:

    这是我定义接口的方法:

      abstract class MatrixElement {
        dynamic operator + (dynamic other);
      }
    

    然后你定义

    class Matrix<T extends MatrixElement> {}
    

    对于我的类型,我最后实现了 MatrixElement 类:

    class MatrixDouble implements MatrixElement {
        dynamic operator + (dynamic other) {
             return this.double + other;
        }
    }
    

    而且 T 应该有操作符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 2015-04-28
      • 2016-02-01
      • 2015-03-06
      • 2016-06-10
      • 2010-10-04
      相关资源
      最近更新 更多