我很好奇为什么当Dart通过继承的类型参数传入时,它不会将超类标记为不正确的类型?将继承类型作为参数意味着应该使用继承类型的接口,超类可能没有。这好像是一个bug?
以下举例:
class ClassTest {
int i;
}
void a(Object x) {
b(x); // ClassTest inherits Object, but that doesn't mean it has the same interface
}
void b(ClassTest x){
x.i = 2; // a() can pass a non type safe class to make this fail
}
这对我来说编辑器没有错误。我至少期待一个关于' x'在被传递之前被投射as ClassTest
?我不确定这是否是正常行为,但我已经遇到过相当多的事情。
感谢阅读。
答案 0 :(得分:3)
这不是一个错误,它是一个功能。见this answer from Bob Nystrom, engineer on the Dart team:
Dart在这里与众不同。它具有称为“赋值兼容性”的东西,用于确定哪些赋值有效。大多数语言只使用正常的子类型规则:如果从子类型分配超类型,则赋值是安全的。 Dart的赋值兼容性规则还允许从超类型分配到子类型。
换句话说,您可以在赋值中隐式转发,而无需任何类型的显式转换。所以这里没有静态警告。但是,如果在已检查模式下运行代码并且该向下转换结果无效(如此处所示),则在尝试将双精度赋值给x时,将在运行时收到类型错误。