定义
有时候会需要这种情况:父类的某个方法定义了形参的类型,而子类想把这个方法的形参类型范围缩小至父类定义的类型的某个子类,这种情况下,如果直接修改是无法通过编译的,这就需要covariant关键字登场了。
例子
abstract class Creature{
String name;
Creature(this.name);
}
abstract class Animal extends Creature{
Animal(String name) : super(name ?? "动物");
void eat(covariant Creature target);
}
abstract class Plant extends Creature{
Plant(String name) : super(name ?? "植物");
}
class Rabbit extends Animal{
Rabbit(): super("兔子");
@override
void eat(Plant target) {
print("$name吃掉了t${target.name}");
}
}
上面例子中,标记了covariant关键字的形参类型可以被子类收缩