关于Dart重写方法时健全返回类型示例的困惑
问题解答
你忽略了两个示例里的父类Animal的parent getter返回类型根本不一样!
正确示例(HoneyBadger)的逻辑
这个例子里的父类定义是:
abstract class Animal { Animal get parent; // 返回类型是Animal基类 }
HoneyBadger继承自Animal,它重写parent时返回HoneyBadger——而HoneyBadger是Animal的子类型,这符合Dart的协变返回类型规则:重写方法的返回类型可以是原返回类型的子类型,这种写法不会破坏类型安全,所以被判定合法。
错误示例(Root)的逻辑
这个例子里的Animal类和第一个完全不同,它的定义是:
abstract class Animal { HoneyBadger get parent; // 返回类型是HoneyBadger子类 }
Root虽然是Animal的子类,但Root并不是HoneyBadger的子类型。重写时返回Root,相当于把返回类型改成了原返回类型(HoneyBadger)的无关类型,违反了健全类型系统的规则,所以被判定错误。
简单说:两个例子看似逻辑一致,实则父类方法的返回类型完全不同,一个是基类、一个是特定子类,这才导致了结果差异。
内容的提问来源于stack exchange,提问作者oerdnj
相关产品推荐
相关产品推荐

