我将从代码开始,因为我很难在没有它的情况下描述这个问题。
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本身的限制还是我做错了什么?
编辑回应雷米指出我正在定义withEvents
wrongly:将withEvent
定义为void withEvent<E extends Event, S extends State>(EventFunction<E, S> func) { }
我可以用所需的参数调用它,但是,我也被允许用Future<FooState> bar(int event)
之类的东西来调用它,因为int
不会扩展Event
。
问题出在你的withEvent
函数的定义中:
void withEvent(EventFunction func) { }
这不符合您的期望。它相当于:
void withEvent(EventFunction<dynamic, dynamic> func) { }
您还需要制作withEvent
通用:
void withEvent<E extends Event, S extends State>(EventFunction<E, S> func) { }
实际上,你所尝试的是正确的,应该有效。事实是,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) { }
这应该工作。希望能帮助到你!