我今天写了一些 dart 代码,本质上可以归结为以下内容:
extension MapCounting<ItemT> on Map<ItemT, num> {
num get maxValue => values.reduce((max, value) => (max < value)? value : max);
}
现在,假设我有一个main()
这样的方法:
void main() {
Map<String, int> myMap = {
"a": 1,
"b": 2,
"c": 3,
};
var count = myMap.maxValue; // valid because Map<String, int> is a valid subtype
}
上述代码不会引发编译时错误。但是,如果你运行它,你将收到此错误:
TypeError: Instance of '(num, num) => num': type '(num, num) => num' is not a subtype of type '(int, int) => int'
我想我明白为什么这是一个错误——实际上,问题的关键在于我的“reducer”函数仅num
在需要返回时才返回int
。这是因为Map<String, int>.reduce()
期望一个int Function(int, int)
,而我的定义只能保证它是一个num Function(...)
。
我对此有两个疑问:
- 为什么编译器没有将其捕获为错误?难道不应该捕获吗?
- 我怎样才能(很好地)修复我的扩展?
从技术上讲,我找到了第二个问题的答案,但它基本上涉及在 之外重写我的代码extension
。 是否可以使用get maxValue
内部的 getter来实现extension
?