类型 '(int) => void' 不是类型 '(Object) => void' 的子类型

问题描述 投票:0回答:1

我检查了我所有的仿制药都没有问题。看来继承还是可以的。类型推断似乎没问题。没有编译器错误。我没有任何硬类型铸造。一切似乎都是强类型的。

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 很困惑)我希望是我。但这个错误只发生在运行时。

flutter dart
1个回答
0
投票

在这部分代码中

  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);

时不会显示任何编译错误

不知道有没有什么办法可以防止这个运行时错误的发生

© www.soinside.com 2019 - 2024. All rights reserved.