我将从代码开始,因为在没有它的情况下我很难描述这个问题。
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
的{{1}}以及继承自{{1 }}。但是,编译器声称它们不是同一类型,不是,但它们是兼容的。这是Dart本身的限制,还是我做错了什么?
编辑
回应Rémi指出我错误地定义了Future
:
将State
定义为Event
可以使用所需的参数来调用它,但是,我也可以使用类似withEvents
的名称来调用它,这与withEvent
一样不受欢迎不扩展void withEvent<E extends Event, S extends State>(EventFunction<E, S> func) { }
。
答案 0 :(得分: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) { }
答案 1 :(得分: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) { }
这应该有效。希望对您有帮助!