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

eivnm1vs  于 2023-04-09  发布在  其他
关注(0)|答案(1)|浏览(168)
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>并让它工作的解决方案,我想知道为什么当我重写一个方法和调用常规方法时,事情会被不同地对待。

oxcyiej7

oxcyiej71#

void Function(int x)通常不是void Function(dynamic x)的有效覆盖,因为int版本不能替代dynamic版本。
void Function(dynamic)Parent<dynamic>.method的类型)允许的输入是什么?Anything
void Function(int)Child.method的类型)允许的输入是什么?只有int s。
因此,这样的覆盖可能会违反Parent<dynamic>接口的约定(例如,如果您有一个Child的示例,并将其传递给需要Parent<dynamic>的对象,然后该对象在其上调用method('not an int'),该怎么办?)
(Note一般来说,在需要采用较宽类型的函数的地方,不能使用采用较窄类型的函数,即使较窄类型派生自较宽类型。
Dart允许你使用covariant关键字来抑制静态类型错误并显式地允许重写,但要注意这样做不一定是类型安全的,你需要负责确保在运行时不会得到类型错误。
进一步阅读:协变与逆变(计算机科学)

相关问题