通过Dart

时间:2015-06-28 19:52:02

标签: inheritance types dart arguments

我很好奇为什么当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?我不确定这是否是正常行为,但我已经遇到过相当多的事情。

感谢阅读。

1 个答案:

答案 0 :(得分:3)

这不是一个错误,它是一个功能。见this answer from Bob Nystrom, engineer on the Dart team

  

Dart在这里与众不同。它具有称为“赋值兼容性”的东西,用于确定哪些赋值有效。大多数语言只使用正常的子类型规则:如果从子类型分配超类型,则赋值是安全的。 Dart的赋值兼容性规则还允许从超类型分配到子类型。

     

换句话说,您可以在赋值中隐式转发,而无需任何类型的显式转换。所以这里没有静态警告。但是,如果在已检查模式下运行代码并且该向下转换结果无效(如此处所示),则在尝试将双精度赋值给x时,将在运行时收到类型错误。