在Dart中,可以转换通用功能吗?

时间:2019-04-26 09:14:52

标签: dart flutter

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

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) { }

2 个答案:

答案 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) { }

这应该有效。希望对您有帮助!