Val*_*nal 0 abstract-class extends types dart
我有 2 个类(B和C),我正在尝试创建一个父类型,以便我可以操作type 的A变量。下面的例子工作正常:aA
class A {}
class B extends A {}
class C extends A {}
var b = true;
final A a = b ? C() : B();
Run Code Online (Sandbox Code Playgroud)
但由于某种原因,当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
Run Code Online (Sandbox Code Playgroud)
我收到 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)
Run Code Online (Sandbox Code Playgroud)
是什么原因?我可以在没有显式强制转换的情况下使其工作吗as A?
Dart 的UP算法用于在需要时查找公共超类型,但并不是那么聪明。(由于各种原因,包括过于聪明可能会导致它在某些情况下永远不会终止)。
这里的表达式b ? C() : B()试图找到类型C和的公共超类型B。它们的直接超级接口分别是 justA<int>和A<String>,是不相关的类型。两者都不是另一个的子类型,因此两者都不能用作公共超类型。它们的直接超级接口都是 just Object,因此我们有一个解决方案。所以,UP ( B, C) 是Object,这就是 的类型b ? C() : B()。(这实际上不是来自链接的文档,这些类型的UP算法会落入当前语言规范的最小上限算法,从而给出结果Object)。
您可能期望算法能够找到A<Object>相反的结果。我只能说不会。该算法将仅查看所比较的两种类型实际实现的类型,其中A<String>和A<int>是不同的不相关类型,并且A<Object>实际上不在任一类型实现的接口之中。他们唯一常见的实现类型是Object.
| 归档时间: |
|
| 查看次数: |
358 次 |
| 最近记录: |