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

标签 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
  }
}

错误:

void Function(int) isn't a valid override of void Function(dynamic)



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

PS:

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

最佳答案

void Function(int x)通常不是 void Function(dynamic x) 的有效覆盖因为 int版本不可替代 dynamic版本。Parent<dynamic>.method 的允许输入是什么? ?任何事物。Child.method 的允许输入是什么? ?只需 int s。
因此,这种覆盖可能违反 Parent<dynamic> 的契约(Contract)。的界面。 (例如,如果你有一个 Child 的实例并将它传递给期望 Parent<dynamic> 的对象,然后调用 method('not an int') 呢?)
(请注意,这并非特定于方法覆盖。 通常,在预期采用更宽类型的函数 时,不能使用采用较窄类型的函数,即使较窄的类型派生自较宽的类型类型。)
Dart 确实允许您使用 covariant keyword抑制静态类型错误并明确允许覆盖,但请注意,这样做不一定是类型安全的,您将负责确保在运行时不会出现类型错误。
进一步阅读:Covariance and contravariance (computer science) from Wikipedia

关于dart - void Function(int) 不是 void Function(dynamic) 的有效覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63892739/

相关文章:

android - 为什么我的扩展磁贴扩展到整个屏幕

charts - 格式化Charts_flutter时间序列图中的时间标签以包括hh:mm:ss

flutter - 将hasura与flutter一起使用,出现以下错误,Graphql版本^ 3.0.0

列表addAll抛出错误:Unhandled Exception: Concurrent modification during iteration:

android - 如何在 List Flutter 中创建 SearchView

自定义时间触发功能中的 Flutter 后台服务

javascript - 将 Javascript 回调转换为 Dart future

google-app-engine - 无法解决 Dart App Engine 依赖性

flutter - 如何在ChangeNotifier提供者Flutter中关闭函数

angular - Angular 手动更改检测到分离的组件