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秒。

因此,这种覆盖可能违反 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/61966135/

相关文章:

flutter - 如何根据 parent 在 flutter 的大小

flutter - SocketException : Failed host lookup: 'methods.abc.com' (OS Error: No address associated with hostname, errno = 7), StackTrace:

dart - Flutter:步进器 onStepContinue 未触发

dart - 如何实现层层叠叠?

list - Dart 列表中的 addAll() 与 followBy() 有什么区别?

flutter - 使用 Bloc 添加到列表( flutter )

flutter - 选择下拉按钮时文本字段焦点卡住

firebase - Stream 初始状态是 ConnectionState.waiting 而不是 null

android - 由于当前屏幕上的更新,防止 Flutter Provider 重建前一屏幕中的小部件

flutter - 为什么 pubspec environment/sdk/uses "' >=2.7.0 <3.0. 0' "而不是 "^2.7.0 "