为具有泛型函数字段的泛型类实现 `copyWith`

问题描述 投票:0回答:1

考虑以下课程:

@immutable
class Foo<T, R> {
  const Foo({
    required this.bar,
  });

  final R Function(T data) bar;

  Foo copyWith({
    R Function(T data)? bar,
  }) {
    return Foo(
      bar: bar ?? this.bar,
    );
  }
}

在上面的类中,

bar: bar ?? this.bar
行产生诊断消息:

参数类型“R Function(T)”无法分配给参数 输入“动态函数(动态)”。

如何在不可变泛型类中为泛型函数字段实现

copyWith
方法?

dart generics
1个回答
0
投票

您的问题是您的

copyWith
实现被声明返回
Foo
,但这是
Foo<dynamic, dynamic>
的简写。然后,类型推断自上而下流向返回的表达式,导致
Foo(bar: bar ?? this.bar)
被推断为构造
Foo<dynamic, dynamic>
,而不是构造
Foo<T, R>
(否则会从自下而上的类型推断中发生)。

因此您应该修复返回类型:

  Foo<T, R> copyWith({
    R Function(T data)? bar,
  }) {
    return Foo(
      bar: bar ?? this.bar,
    );
  }

请注意,您可以通过执行以下操作强制自下而上推理:

  // Probably not what you want!
  Foo copyWith({
    R Function(T data)? bar,
  }) {
    var copy = Foo(
      bar: bar ?? this.bar,
    );
    return copy;
  }

这也可以避免静态类型错误,但最终会隐式地将

Foo<T, R>
转换为
Foo<dynamic, dynamic>
,这可能不是你想要的。

© www.soinside.com 2019 - 2024. All rights reserved.