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)
。但它不是这样工作的,第二个参数的类型是在没有任何来自第一个参数类型的输入的情况下找到的(反之亦然)
在空安全模式下,函数的参数类型默认为
对象?
而不是动态
,但是无效函数(对象?
仍然是有效的无效函数(字符串)
是否有计划更改此行为?若否,原因为何?我可以阅读一个问题来更好地理解它。是否有任何计划来改变这种行为?若否,原因为何?我可以阅读一个问题,以便更好地理解它。