我遇到了以下问题:
class A {}
class B extends A {}
class C<T extends A> {
C() {
test(B()); // line 7
}
void test(T t) {}
}
错误:参数类型'B‘不能分配给参数类型'T’-第7行
我不明白为什么不能将B类型分配给T类型的参数,因为B明显地扩展了A,而T也定义为扩展A?为了修复此错误,我尝试将B转换为B:
test(B() as B);
信息:不必要的强制转换-第7行
这个信息对我来说是有意义的,但我不明白为什么这个转换修复了错误,而且这在运行时对我也有效。我发现的最佳解决方案是:
test(B() as T);
发布于 2021-01-07 09:41:09
我不知道Dart,但这在C#中也是无效的,我希望原因也是一样的。
假设您有以下代码(对任何无效语法表示歉意):
class D extends A {}
var c = C<D>();
在这个新对象的上下文中,相关的T
是D
--它是C<D>
的一个实例。所以您的test
方法逻辑上期望有一个D
..。但你为它提供了一个B
。假设您的test
方法存储了该值,然后另一个方法将其返回为T
,那么您可以拥有:
var c = C<D>();
var d = c.getValue();
该代码将期望getValue()
的返回值为D
,但实际上它是一个B
。
我对Dart还不太了解,不知道为什么转换会删除错误,但在我看来,您的代码在根本上是危险的,在我前面描述的场景中可能会在某个时候失败。我怀疑你需要重新设计代码。
https://stackoverflow.com/questions/65609775
复制相似问题