Generics 混淆泛型

Generics 混淆泛型,generics,dart,Generics,Dart,我试图理解Dart泛型。当我编写自己的自定义泛型类时,我就理解了泛型是如何工作的,比如 Class1类{ T函数1(T para1,T para2){ 返回para1=para2; } } main(){ var mycl=新类别1(); 打印(mycl.func1(3,5)); } 我知道,这是一个非常简单的例子,也许这没有意义,但无论如何,我知道如何使用泛型 但是现在,我的问题是什么,看看这个代码 StreamSubscription侦听(函数void onData(T事件),{Funct

我试图理解Dart泛型。当我编写自己的自定义泛型类时,我就理解了泛型是如何工作的,比如

Class1类{
T函数1(T para1,T para2){
返回para1=para2;
}
}
main(){
var mycl=新类别1();
打印(mycl.func1(3,5));
}
我知道,这是一个非常简单的例子,也许这没有意义,但无论如何,我知道如何使用泛型

但是现在,我的问题是什么,看看这个代码

StreamSubscription侦听(函数void onData(T事件),{Function onError,Function void onDone(),bool cancelOnError})
我从HttpServerAPI复制了它,它是listen方法。我的问题是,Dart是否支持泛型方法?我在网上搜索有关Dart泛型方法的信息,但找不到它


我真的很想理解,如何阅读Dart API docu,但有时很难理解。

Dart真的不需要它们。类型是可选的,您可以删除它们并使用“duck typing”。

void main(){
returnNthElement(int索引,var某物){
返回某物[索引];
}
打印(返回元素(1[1,2,3,4,5]);//2
打印(returnntheelement(1,“HELLO”);/E
打印(returnNthElement(1100));//NoSuchMethodError:找不到方法:“[]”
}
但由于泛型类型在运行时保持不变,您可以这样使用它们:

void main(){
傅(名单一){
如果(l是列表)返回“$l是整数列表”;
如果(l是列表)返回“$l是字符串列表”;
}
var li=新列表();
李亚德尔([1,2,3,4,5]);
var ls=新列表();
ls.addAll([“你好”,“飞镖”);
print(foo(li));//[1,2,3,4,5]是int的列表
print(foo(ls));//[HELLO,DART]是字符串列表
}
Dart不支持泛型方法

这里看到的是泛型类中的一个方法。
T
类型变量来自类
类流

方法:

StreamSubscription侦听(函数void onData(T事件),{Function onError,Function void onDone(),bool cancelOnError})
这意味着在
上,
listen
方法返回一个
StreamSubscription
,它需要一个接受
int
参数的
onData
函数

例如:

班级礼物{
T_含量;
礼物(T内容):\u内容=\u内容;
礼品包装()=>新礼品(本);
T unwrap()=>\u内容;
T替换(T替换(T电流)){
var old=_内容;
_内容=替换(旧);
返老还童;
}
}
函数
wrap
不是“通用”函数。它根据当前对象的类型返回一个新类型。返回类型包含
T
,但它与调用该方法的
Gift
实例的
T
相同

函数
replace
采用类型为
T->T
的参数。该方法不是“泛型的”,它只是有一个类型,该类型取决于
Gift
实例中
T
的类型,称为one


也就是说,这些方法不是泛型的,因为每次调用它们时都可以使用新的类型参数对它们进行参数化。相反,
Gift
类是泛型的,并且
Gift
的每个实例都有一个type参数的值。此类实例上的方法可以在其签名中使用该类型参数,但对于一个
Gift
实例,类型总是相同的。
Gift
将有一个
wrap
方法返回
Gift
,而
replace
方法需要一个类型为
int->int

的参数。请向我展示一些示例,我如何使用StreamSubscription之类的泛型。谢谢