Dart向下转型

3

我需要在Dart中进行向下转型。例如,从Objectint是可能的,但我无法使用自己的类来实现它。我做错了什么吗?或者正确的方式是什么?

class Person {
  final String name;
  final int age;
  Person(this.name, this.age);
}

class CoolPerson extends Person {
  CoolPerson(String name, int age): super(name, age);

  int someFunction() {
    return name.length * age;
  }
}


main() {

Object x = 42; 
int i = x as int;

print('Im $i');  

Person person = Person('Peter', 30);
CoolPerson coolPerson = person as CoolPerson;
  
print('Im ${coolPerson.name}');

}

这段代码的结果是:
我是42岁
未捕获的错误:TypeError:'Person'的实例:类型'Person'不是类型'CoolPerson'的子类型。

4
正如堆栈跟踪和现实生活中所说的那样,“Person”并不总是“CoolPerson”。这里的“person”只是一个“Person”。想象一下如果“CoolPerson”有一个额外的构造函数参数,那么强制转换会发生什么? - Henry Twist
4
下行转换是不安全的;这就是为什么它们需要显式转换,即程序员断言基本类型实际上是派生类型的实例。当该声明不成立时,您最终会在运行时遇到错误。您的“person”从未是“CoolPerson”的实例,因此转换失败。如果您希望转换成功,则必须首先构造一个“CoolPerson”。 - jamesdlin
1个回答

1
最好从一开始就创建一个CoolPerson。否则,不可能将person as CoolPerson;进行转换。解决方法是从person创建一个CoolPerson
Person person = Person('Peter', 30);
CoolPerson coolPerson = CoolPerson(person.name, person.age);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接