首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >奇怪的飞镖一般分配行为

奇怪的飞镖一般分配行为
EN

Stack Overflow用户
提问于 2021-01-07 09:33:13
回答 1查看 160关注 0票数 1

我遇到了以下问题:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
test(B() as B);

信息:不必要的强制转换-第7行

这个信息对我来说是有意义的,但我不明白为什么这个转换修复了错误,而且这在运行时对我也有效。我发现的最佳解决方案是:

代码语言:javascript
运行
复制
test(B() as T);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-07 09:41:09

我不知道Dart,但这在C#中也是无效的,我希望原因也是一样的。

假设您有以下代码(对任何无效语法表示歉意):

代码语言:javascript
运行
复制
class D extends A {}

var c = C<D>();

在这个新对象的上下文中,相关的TD --它是C<D>的一个实例。所以您的test方法逻辑上期望有一个D..。但你为它提供了一个B。假设您的test方法存储了该值,然后另一个方法将其返回为T,那么您可以拥有:

代码语言:javascript
运行
复制
var c = C<D>();
var d = c.getValue();

该代码将期望getValue()的返回值为D,但实际上它是一个B

我对Dart还不太了解,不知道为什么转换会删除错误,但在我看来,您的代码在根本上是危险的,在我前面描述的场景中可能会在某个时候失败。我怀疑你需要重新设计代码。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65609775

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档