首页 > 解决方案 > void Function(int) 不是 void Function(dynamic) 的有效覆盖

问题描述

class Parent<T> {
  void method(T t) {}
}

class Child extends Parent {
  @override
  void method(int i) {} // error: mentioned_below

  void takesDynamic(dynamic d) {
    takesType(d); // no error
  }

  void takesType(int i) {
    takesDynamic(i); // no error
  }
}

错误:

void Function(int) 不是 void Function(dynamic) 的有效覆盖

当我可以轻松地传递intdynamic方法参数时,反之亦然,为什么我在覆盖方法时会看到错误。


PS:

我不是在寻找一个可以使用extends Parent<int>并让它工作的解决方案,我想知道为什么当我覆盖一个方法与调用常规方法时事情会被不同地对待的原因。

标签: dart

解决方案


void Function(int x)通常不是有效的覆盖,void Function(dynamic x)因为该int版本不可替代该dynamic版本。

允许的输入是Parent<dynamic>.method什么?任何东西

允许的输入是Child.method什么?只是ints。

因此,这样的覆盖可能会违反Parent<dynamic>'s 接口的合同。(例如,如果您有一个实例Child并将其传递给期望Parent<dynamic>的对象,然后method('not an int')在其上调用呢?)

(请注意,这并不特定于方法覆盖。 一般来说,采用较窄类型的函数不能用于预期采用较宽类型的函数,即使较窄类型派生自较宽类型。)

Dart 确实允许您使用covariant关键字来抑制静态类型错误并明确允许覆盖,但请注意,这样做不一定是类型安全的,您将负责确保您不会在运行。

进一步阅读:来自维基百科的协变和逆变(计算机科学)


推荐阅读