我检查了我所有的仿制药都没有问题。看来继承还是可以的。类型推断似乎没问题。没有编译器错误。我没有任何硬类型铸造。一切似乎都是强类型的。
class ModelField {}
class DropdownField<V> extends ModelField {
final void Function(V value) setValue;
final List<V> options;
DropdownField({
required this.setValue,
required this.options,
});
}
void _buildDropdownField<V>(DropdownField<V> field) {
final options = field.options;
final data = options.first;
field.setValue(data); // error Here
}
void _renderField(ModelField field) {
/// from server
// if field is StringField, else if field is DateField, ... else
if (field is DropdownField<Object>) {
// print('field is DropdownField<dynamic, dynamic>');
_buildDropdownField(field);
}
}
void main() {
final field =
DropdownField<int>(setValue: (value) => print(value), options: [1, 2, 3]);
_renderField(field);
}
但是当我跑步时:
Unhandled exception:
type '(int) => void' is not a subtype of type '(Object) => void'
#0 _buildDropdownField (package:shared_core/weird_dart/generic_promotion.dart:18:9)
#1 _renderField (package:shared_core/weird_dart/generic_promotion.dart:26:5)
#2 main (package:shared_core/weird_dart/generic_promotion.dart:34:3)
#3 _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:297:19)
#4 _RawReceivePort._handleMessage (dart:isolate-patch/isolate_patch.dart:184:12)
int
怎么可能不是Object
的子类型???
我很困惑(或者 Dart 很困惑)我希望是我。但这个错误只发生在运行时。
在这部分代码中
if (field is DropdownField<Object>) {
// print('field is DropdownField<dynamic, dynamic>');
_buildDropdownField(field);
}
field
被转换为 DropdownField<Object>
,这意味着 _buildDropdownField
会将其识别为 DropdownField<Object>
,即使它实际上是 DropdownField<int>
。这反过来又使得它在行中
final data = options.first;
data
的类型为 Object
。
_buildDropdownField
无法知道field
实际上是DropdownField<int>
,因为就其而言,它实际上是DropdownField<Object>
,因此在尝试执行field.setValue(data);
时不会显示任何编译错误
不知道有没有什么办法可以防止这个运行时错误的发生