在Dart中,是否可以升级通用函数?

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

我将从代码开始,因为我很难在没有它的情况下描述这个问题。

typedef Future<S> EventFunction<E extends Event, S extends State>(E event);

abstract class State { }
abstract class Event { }

class FooState extends State { }
class FooEvent extends Event { }

void main() {
  withEvent(foo);
}

void withEvent(EventFunction func) { }

Future<FooState> foo(FooEvent event) { }

看到这段代码,我假设我可以使用任何函数调用withEvent,该函数返回一个扩展Future的类型的State和任何继承自Event的实例。但是,编译器声称它们不是同一类型,它们不是,但它们是兼容的。这是Dart本身的限制还是我做错了什么?

编辑回应雷米指出我正在定义withEventswrongly:将withEvent定义为void withEvent<E extends Event, S extends State>(EventFunction<E, S> func) { }我可以用所需的参数调用它,但是,我也被允许用Future<FooState> bar(int event)之类的东西来调用它,因为int不会扩展Event

dart flutter
2个回答
0
投票

问题出在你的withEvent函数的定义中:

void withEvent(EventFunction func) { }

这不符合您的期望。它相当于:

void withEvent(EventFunction<dynamic, dynamic> func) { }

您还需要制作withEvent通用:

void withEvent<E extends Event, S extends State>(EventFunction<E, S> func) { }

0
投票

实际上,你所尝试的是正确的,应该有效。事实是,dart是类型安全的,如果函数类型接受任何一个,你必须指定generics arguments

在这里,你的EventFunction事件函数接受withEvent定义中缺少的两个泛型类型参数。

只是改变你的,

void withEvent(EventFunction func) { } // dart infers EventFunction = EventFunction<dynamic,dynamic> when no generic arguments passed

至,

void withEvent(EventFunction<FooEvent,FooState> func) { }

这应该工作。希望能帮助到你!

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