Dart extended 类 with generic types 不会使用直接父类型
Dart extended classes with generic types won't use the direct parent type
我有 2 个 类(B
和 C
),我正在尝试创建父类型 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()
试图找到类型 C
和 B
的公共超类型。它们的直接超级接口分别是A<int>
和A<String>
,是不相关的类型。两者都不是另一个的子类型,因此都不能用作通用超类型。
它们的直接超级接口都是 Object
,因此我们有一个解决方案。
所以,UP(B
,C
)是Object
,也就是b ? C() : B()
的类型。
(这实际上不是来自链接文档,这些类型的 UP 算法落入了当前语言规范的最小上限算法,给出了结果 Object
).
您可能期望算法会找到 A<Object>
。我只能说不会。该算法只会查看被比较的两个类型实际实现的类型,其中 A<String>
和 A<int>
是不同的不相关类型,而 A<Object>
实际上不在所实现的接口之中无论哪种类型。他们唯一常见的实现类型是Object
.
我有 2 个 类(B
和 C
),我正在尝试创建父类型 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()
试图找到类型 C
和 B
的公共超类型。它们的直接超级接口分别是A<int>
和A<String>
,是不相关的类型。两者都不是另一个的子类型,因此都不能用作通用超类型。
它们的直接超级接口都是 Object
,因此我们有一个解决方案。
所以,UP(B
,C
)是Object
,也就是b ? C() : B()
的类型。
(这实际上不是来自链接文档,这些类型的 UP 算法落入了当前语言规范的最小上限算法,给出了结果 Object
).
您可能期望算法会找到 A<Object>
。我只能说不会。该算法只会查看被比较的两个类型实际实现的类型,其中 A<String>
和 A<int>
是不同的不相关类型,而 A<Object>
实际上不在所实现的接口之中无论哪种类型。他们唯一常见的实现类型是Object
.