飞镖传递通用函数<T>(T t)似乎需要强制转换,所有其他方式签名不匹配



以下面的代码为例,我不知道如何使泛型类型的Function与out casting一起工作,如图所示。我每隔一次尝试,都会得到的一些变体

参数类型"Null Function(Gift("不能分配给参数类型‘动态函数(T(’

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

没有为类型"Object"定义getter"name">

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

应该有一种方法可以在没有演员的情况下做到这一点,对吧?

您的类定义不符合您的意图:

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

CCD_ 1是单独参数化的;其CCD_ 2型参数与CCD_。不需要参数化openedCallback,因为您可能想要:

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

之后,你可以做:

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

请注意,执行<T>(t) { ... }<Gift>(t) { ... }会适得其反。它声明了一个匿名函数,该函数本身是泛型的,并且具有一个分别名为TGift的类型参数。

最新更新