Generics 推理不适用于泛型方法

Generics 推理不适用于泛型方法,generics,dart,Generics,Dart,我有一个类的通用方法: StreamSubscription每个(流, 空洞函数(T)fn, {Symbol uniqueId}); 当我使用它时,fn的参数是动态的: 流; 每个(流,((项){}));//这里的项目是动态的。 //我必须手动告诉类型: 每个(); //或 每个(流,((字符串项){})); 它至少应该是Object,因为T应该扩展Object,对吗 我已经在nullsafety dartpad版本上进行了测试,不同之处在于fn的参数现在是Object?而不是dynamic

我有一个类的通用方法:

StreamSubscription每个(流,
空洞函数(T)fn,
{Symbol uniqueId});
当我使用它时,
fn
的参数是动态的:

流;
每个(流,((项){}));//这里的项目是动态的。
//我必须手动告诉类型:
每个();
//或
每个(流,((字符串项){}));
它至少应该是
Object
,因为
T
应该扩展
Object
,对吗


我已经在nullsafety dartpad版本上进行了测试,不同之处在于
fn
的参数现在是
Object?
而不是dynamic。我认为这可能是另一个推理错误,因为
fn
的参数是
T
,而不是
T?
,Dart泛型函数类型参数推理的工作方式是,它独立检查每个参数,然后尝试将其与匹配所有参数的类型参数组合

在这种情况下,
each(stream,(item){})
没有类型参数和上下文类型(因此没有基于返回类型的约束),因此推理算法在不知道
T
的情况下查找每个参数的静态类型

的静态类型是
(item){}
的静态类型是
无效函数(动态)

然后它尝试查找类型
T
,这样
Stream
就是
Stream
void Function(dynamic)
就是
void Function(T)
。可以使用
字符串
对象
(包括
动态
预空安全)之间的任何类型,因为函数类型参数是相反的。Dart选择
String
,这是两个参数都满足的有效选择,但函数文本的类型不变,它保持
void function(dynamic)

您似乎期望的是第一个参数
stream
,用于派生
T
=
String
,然后
String
用于推断函数是
无效函数(String)
。但它不是这样工作的,第二个参数的类型是在没有任何来自第一个参数类型的输入的情况下找到的(反之亦然)


在空安全模式下,函数的参数类型默认为
Object?
而不是
dynamic
,但是
void函数(Object?
仍然是有效的
void函数(String)

Dart泛型函数类型参数推断工作方式是,它独立检查每个参数,然后尝试将其与匹配所有类型的类型参数组合

在这种情况下,
each(stream,(item){})
没有类型参数和上下文类型(因此没有基于返回类型的约束),因此推理算法在不知道
T
的情况下查找每个参数的静态类型

的静态类型是
(item){}
的静态类型是
无效函数(动态)

然后它尝试查找类型
T
,这样
Stream
就是
Stream
void Function(dynamic)
就是
void Function(T)
。可以使用
字符串
对象
(包括
动态
预空安全)之间的任何类型,因为函数类型参数是相反的。Dart选择
String
,这是两个参数都满足的有效选择,但函数文本的类型不变,它保持
void function(dynamic)

您似乎期望的是第一个参数
stream
,用于派生
T
=
String
,然后
String
用于推断函数是
无效函数(String)
。但它不是这样工作的,第二个参数的类型是在没有任何来自第一个参数类型的输入的情况下找到的(反之亦然)


在空安全模式下,函数的参数类型默认为
对象?
而不是
动态
,但是
无效函数(对象?
仍然是有效的
无效函数(字符串)

是否有计划更改此行为?若否,原因为何?我可以阅读一个问题来更好地理解它。是否有任何计划来改变这种行为?若否,原因为何?我可以阅读一个问题,以便更好地理解它。