Dart extended 类 with generic types 不会使用直接父类型

Dart extended classes with generic types won't use the direct parent type

我有 2 个 类(BC),我正在尝试创建父类型 A 以便我可以操作变量 a 类型 A。 以下示例工作正常:

class A {}

class B extends A {}

class C extends A {}

var b = true;

final A a = b ? C() : B();

但由于某些原因,当 A 具有泛型类型 A<T> 时,它不起作用

class A<T> {}

class B extends A<int> {}

class C extends A<String> {}

var b = true;

final A a = b ? C() : B(); // <- Error

我收到 linting 错误:

A value of type 'Object' can't be assigned to a variable of type 'A<dynamic>'. Try changing the type of the variable, or casting the right-hand type to 'A<dynamic>'.dart(invalid_assignment)

这是什么原因?我可以在没有显式转换的情况下使它工作吗 as A?

Dart 的 UP 算法,用于在需要时查找公共超类型, 并不聪明。 (由于各种原因,包括太聪明可能导致它在某些情况下永远不会终止)。

此处表达式 b ? C() : B() 试图找到类型 CB 的公共超类型。它们的直接超级接口分别是A<int>A<String>,是不相关的类型。两者都不是另一个的子类型,因此都不能用作通用超类型。 它们的直接超级接口都是 Object,因此我们有一个解决方案。 所以,UP(B,C)是Object,也就是b ? C() : B()的类型。 (这实际上不是来自链接文档,这些类型的 UP 算法落入了当前语言规范的最小上限算法,给出了结果 Object).

您可能期望算法会找到 A<Object>。我只能说不会。该算法只会查看被比较的两个类型实际实现的类型,其中 A<String>A<int> 是不同的不相关类型,而 A<Object> 实际上不在所实现的接口之中无论哪种类型。他们唯一常见的实现类型是Object.