Dart 给出未处理的异常:类型不是 'value' 类型的子类型
Dart gives Unhandled Exception: type is not a subtype of type of 'value'
我有一个摘要classImageUpdate
。两个 classes,NewImage
和 ExistingImage
实现 ImageUpdate
.
我有一个类型为 List<ImageUpdate>
的变量 imageUpdates
。
当我尝试将类型为 NewImage
的变量添加到列表时,出现此错误:
Unhandled Exception: type 'NewImage' is not a subtype of type 'ExistingImage' of 'value'
我很困惑,因为列表是 ImageUpdate
而不是 ExistingImage
,所以我不知道如何调试它,特别是因为 Dart 是类型安全的(我没有在任何地方使用 dynamic
).
如有任何帮助,我们将不胜感激。
我怀疑您的代码类似于:
class Base {}
class Derived1 extends Base {}
class Derived2 extends Base {}
List<Base> makeList() {
var list = [Derived1()];
return list;
}
void main() {
var list = makeList();
list.add(Derived2()); // TypeError
}
发生的情况是 List
对象最初创建为 List<Derived1>
。 (也就是说,list.runtimeType
将类似于 List<Derived1>
,而不是其 static(声明的)List<Base>
类型。)然后,当您尝试添加一个 Derived2
对象到 list
,它将在运行时失败,因为 list
的实际运行时类型是 List<Derived1>
,它不允许 Derived2
元素。
这最终源于 Dart 允许从 GenericClass<Derived>
到 GenericClass<Base>
的隐式类型转换,如果 Derived
派生自 Base
。这在很多情况下很有用,但也可能导致像这种情况在运行时失败。
您可以通过明确声明您想要一个 List<Base>
对象来解决此问题:
List<Base> makeList() {
var list = <Base>[Derived1()]; // Note the explicit type.
return list;
}
或者,如果这不可能,则通过创建一个新的 List<Base>
对象:
var list = <Base>[...makeList()];
var list = List<Base>.from(makeList());
(在这种特殊情况下,List.of(makeList())
也可以工作,因为它会创建一个具有静态类型的新 List
对象,但我不会使用它,因为类型转换是明确的会更具可读性。)
我有一个摘要classImageUpdate
。两个 classes,NewImage
和 ExistingImage
实现 ImageUpdate
.
我有一个类型为 List<ImageUpdate>
的变量 imageUpdates
。
当我尝试将类型为 NewImage
的变量添加到列表时,出现此错误:
Unhandled Exception: type 'NewImage' is not a subtype of type 'ExistingImage' of 'value'
我很困惑,因为列表是 ImageUpdate
而不是 ExistingImage
,所以我不知道如何调试它,特别是因为 Dart 是类型安全的(我没有在任何地方使用 dynamic
).
如有任何帮助,我们将不胜感激。
我怀疑您的代码类似于:
class Base {}
class Derived1 extends Base {}
class Derived2 extends Base {}
List<Base> makeList() {
var list = [Derived1()];
return list;
}
void main() {
var list = makeList();
list.add(Derived2()); // TypeError
}
发生的情况是 List
对象最初创建为 List<Derived1>
。 (也就是说,list.runtimeType
将类似于 List<Derived1>
,而不是其 static(声明的)List<Base>
类型。)然后,当您尝试添加一个 Derived2
对象到 list
,它将在运行时失败,因为 list
的实际运行时类型是 List<Derived1>
,它不允许 Derived2
元素。
这最终源于 Dart 允许从 GenericClass<Derived>
到 GenericClass<Base>
的隐式类型转换,如果 Derived
派生自 Base
。这在很多情况下很有用,但也可能导致像这种情况在运行时失败。
您可以通过明确声明您想要一个 List<Base>
对象来解决此问题:
List<Base> makeList() {
var list = <Base>[Derived1()]; // Note the explicit type.
return list;
}
或者,如果这不可能,则通过创建一个新的 List<Base>
对象:
var list = <Base>[...makeList()];
var list = List<Base>.from(makeList());
(在这种特殊情况下,List.of(makeList())
也可以工作,因为它会创建一个具有静态类型的新 List
对象,但我不会使用它,因为类型转换是明确的会更具可读性。)