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

iDe*_*ode 2 dart

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
  }
}
Run Code Online (Sandbox Code Playgroud)

错误:

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

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


PS:

我不是在寻找一种可以使用extends Parent<int>并使其工作的解决方案,我想知道为什么在覆盖方法与调用常规方法时会以不同的方式对待事物。

jam*_*lin 7

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

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

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

因此,这样的覆盖可能会违反Parent<dynamic>的接口的约定。(例如,如果你有一个 的实例Child并将它传递给期望的东西,Parent<dynamic>然后调用method('not an int')它怎么办?)

(请注意,这并非特定于方法覆盖。 通常,在需要采用较宽类型的函数的情况下,不能使用采用较窄类型的函数,即使较窄的类型派生自较宽的类型也是如此。)

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

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