我在Dart的一个泛型函数中遇到了运行时错误:
Widget card = widget.cardBuilder(item);
这将生成:
type '(Contact) => Widget' is not a subtype of type '(DeletableItem) => Widget'
Contact类的定义如下:
class Contact
implements DeletableItem
{
接下来,我有一个方法:
class UndoableListView<T extends DeletableItem>
{
List<T> children;
final Widget Function(T item) cardBuilder;
这就是运行时错误发生的地方。
Widget buildItem(BuildContext context, int index) {
T item = children[index];
Widget card = widget.cardBuilder(item); <<<<< error thrown here.
我对泛型的工作方式显然存在误解。
Contact明确扩展了DeleteableItem。
那么我做错了什么?
Contact
没有实现DeletableItem
,而是整个函数本身的签名不同,因为(Contact) => Widget
无法转换为(DeletableItem) => Widget
。如果没有看到更多的代码,很难提出一个修复建议。您能展示一下buildItem
被使用的上下文吗? - spensterContact
不是DeletableItem
的子类型,而是函数类型Widget Function(Contact)
不是函数类型Widget Function(DeletableItem)
的子类型。函数类型在其参数类型上是逆变的(如果第一个函数的参数类型是第二个函数的参数类型的超类型,则函数类型只能是另一个函数类型的子类型)。因此,这正是预期的工作方式。 - lrn