Flutter每日一篇:声明处型变

75 阅读1分钟

在Flutter中, inout 关键字用于声明类型参数的变化。然而,需要注意的是,Flutter并不直接支持像Kotlin等其他编程语言中的 inout 这样的型变注解。

在Dart中,类型参数默认是不变的。这意味着即使 DerivedBase 的子类型,也不能将类型为 List<Derived> 的变量赋值给类型为 List<Base> 的变量。

如果想在Dart中实现协变或逆变,可以使用类型注解和类型转换来确保类型安全。例如,可以使用 List<out Base> 注解来表示列表可以保存 Base 类型或任何其子类型的元素。类似地,可以使用 List<in Derived> 来表示列表可以保存 Derived 类型或任何其父类型的元素。

以下是一个示例来说明这一点:

class Base {}
class Derived extends Base {}

void main() {
  List<out Base> covariantList = <Derived>[]; // 协变
  covariantList.add(Base()); // 错误:不能将Base添加到Derived的列表中

  List<in Derived> contravariantList = <Base>[]; // 逆变
  contravariantList.add(Derived()); // 正确:可以将Derived添加到Base的列表中
}

请注意,这些注解并不由语言本身强制执行,因此使用时需要谨慎,并手动确保类型安全。