You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dart中强制向下转型时,能否让对象丢失子类构造的额外成员?

在Dart中无法通过类型转换让对象“丢失”子类成员

首先直接给出结论:不行,你没办法仅通过类型转换就让一个子类实例“丢失”它的额外成员。

你的示例代码里,_foo虽然被声明为Foo类型,但它在运行时本质上还是一个Bar实例——类型转换(不管向上还是向下)只是改变了代码里的静态类型标注,完全不会修改对象本身的结构和数据。所以当你把_foo转回Bar类型时,它依然保留着another属性的值,输出world是完全符合预期的。

在Dart的面向对象模型里,对象的运行时类型是它被创建时就确定的,一旦你用Bar的构造函数创建了实例,它就永远是Bar类型,不会因为被赋值给父类类型的变量就变成纯粹的Foo。

如果你的需求是得到一个真正的Foo实例(不带Bar的额外成员),唯一的办法就是重新构造一个新的Foo对象,利用现有实例的父类属性来初始化:

void main() {
  const Foo _foo = Bar('hello','world');
  // 创建真正的Foo实例,剥离Bar的额外成员
  const Foo realFoo = Foo(_foo.message);
  // 这里如果尝试转成Bar会报错,因为realFoo是真正的Foo实例
  // const Bar _bar = realFoo; // 编译错误
}

简单来说,类型转换只是“视角”的变化,不是对象本身的变化——你不能通过换个视角看对象,就让它的一部分消失。

内容的提问来源于stack exchange,提问作者user9836706

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 09:03:12