Dart泛型类中使用子类重写函数出现报错问题求助
问题原因分析
你遇到的报错核心在于泛型参数未明确指定,以及Dart方法重写的类型兼容性规则:
- 当
CryptoManager extends Manager时,没有给父类Manager指定泛型参数,Dart会默认把T解析为Instrument(泛型的边界类型)。 - 此时父类
Manager的fetchCurrentPrice方法签名是Future<double> fetchCurrentPrice(Instrument instrument),而子类的方法签名是Future<double> fetchCurrentPrice(Crypto instrument)——这相当于把方法的参数类型从更宽泛的Instrument缩小到了Crypto,违反了Dart的方法重写规则(子类重写的方法必须能接受父类方法能接受的所有参数,要符合里氏替换原则)。
修复方案
只需要给CryptoManager指定明确的泛型参数Crypto,让父类的T绑定到Crypto,这样父类的fetchCurrentPrice参数类型就会变成Crypto,子类的重写就完全匹配了:
abstract class Instrument { String name = 'Instrument'; double currentPrice = 0.0; Instrument(this.name); } class Crypto extends Instrument { Crypto(super.name); String contractAddress = '0xBCCFF3FF6...'; } abstract class Manager<T extends Instrument> { List<T> instruments = []; Future<double> fetchCurrentPrice(T instrument) async { print('Fetching price for generic instrument'); return 12.80; } } // 重点:这里指定泛型参数为Crypto class CryptoManager extends Manager<Crypto> { @override Future<double> fetchCurrentPrice(Crypto instrument) async { print('Fetching price for crypto'); return 12.80; } } void main(List<String> args) { CryptoManager cryptoManager = CryptoManager(); var btcCrypto = Crypto('BTC'); cryptoManager.fetchCurrentPrice(btcCrypto); }
额外优化建议
如果后续要给Stock也实现对应的StockManager,可以保持这个模式:
- 定义
Stock extends Instrument - 实现
StockManager extends Manager<Stock>,重写fetchCurrentPrice方法
这样既复用了Manager的通用逻辑,又能为不同类型的Instrument实现各自的价格获取逻辑。
内容的提问来源于stack exchange,提问作者Pinocchio
相关产品推荐
相关产品推荐

