Dart 省道传递通用函数<;T>;(T)似乎需要强制转换,所有其他方式签名不';不匹配

Dart 省道传递通用函数<;T>;(T)似乎需要强制转换,所有其他方式签名不';不匹配,dart,Dart,以下面的代码为例,我无法弄清楚如何使泛型类型函数在不进行强制转换的情况下工作,如图所示。我试过的每一种方法都会得到一些变化 无法将参数类型“Null Function(Gift)”分配给 参数类型“动态功能(T)” var present=present(礼物(“精美礼物”),(礼物t){ 打印('${(t作为礼物).name}已打开'); }); 或 未为类型“Object”定义getter“name” var present=present(礼物(“精美礼物”),(t){ 打印(“${t.

以下面的代码为例,我无法弄清楚如何使泛型类型函数在不进行强制转换的情况下工作,如图所示。我试过的每一种方法都会得到一些变化

无法将参数类型“Null Function(Gift)”分配给 参数类型“动态功能(T)”

var present=present(礼物(“精美礼物”),(礼物t){
打印('${(t作为礼物).name}已打开');
});

未为类型“Object”定义getter“name”

var present=present(礼物(“精美礼物”),(t){
打印(“${t.name}已打开”);
});
下面是一个使用cast的工作示例

void main() {
   var present = Present<Gift>(Gift('Fancy Gift'), <T>(t) {
    print('${(t as Gift).name} was opened.');
  });
  present.open();
}


class Present<T> {
  final T _item;
  final Function<T>(T t) openedCallback;

  T open() {
    openedCallback.call(_item);
    return _item;
  }

  Present(this._item, this.openedCallback);
}

class Gift {
  final String name;

  Gift(this.name);
}
void main(){
var present=礼物(礼物(“精美礼物”),(t){
打印('${(t作为礼物).name}已打开');
});
present.open();
}
课堂出席{
最后的T_项目;
最终功能(T)打开回调;
T open(){
openedCallback.call(_项);
退货项目;
}
出席(此._项,此.打开回调);
}
班级礼物{
最后的字符串名;
礼物(这个名字);
}

在没有强制转换权限的情况下,应该有办法做到这一点。

您的类定义没有达到您的目的:

课堂演示{
最后的T_项目;
最终功能(T)打开回调;
...
openedCallback
是单独参数化的;它的
T
类型参数是单独的,独立于
Present
的参数。不需要参数化
openedCallback
,因为您可能想要:

课堂演示{
最后的T_项目;
最终功能(T)打开回调;
...
之后,您可以执行以下操作:

var present=present(礼物(“精美礼物”),(t){
打印(“${t.name}已打开”);
});

请注意,执行
(t){…}
(t){…}
会适得其反。这会声明一个匿名函数,该函数本身是泛型的,并且其类型参数分别名为
t
Gift

<

课堂演示{
最后的T_项目;
最终功能(T)打开回调;
...
openedCallback
是单独参数化的;它的
T
类型参数是单独的,独立于
Present
的参数。不需要参数化
openedCallback
,因为您可能想要:

课堂演示{
最后的T_项目;
最终功能(T)打开回调;
...
之后,您可以执行以下操作:

var present=present(礼物(“精美礼物”),(t){
打印(“${t.name}已打开”);
});
请注意,执行
(t){…}
(t){…}
会适得其反。它声明了一个匿名函数,该函数本身是泛型的,并且具有一个分别名为
t
Gift
的类型参数

var present = Present<Gift>(Gift('Fancy Gift'), <Gift>(t) {
    print('${t.name} was opened.');
  });
void main() {
   var present = Present<Gift>(Gift('Fancy Gift'), <T>(t) {
    print('${(t as Gift).name} was opened.');
  });
  present.open();
}


class Present<T> {
  final T _item;
  final Function<T>(T t) openedCallback;

  T open() {
    openedCallback.call(_item);
    return _item;
  }

  Present(this._item, this.openedCallback);
}

class Gift {
  final String name;

  Gift(this.name);
}