Inheritance 通过Dart中的子类参数传递超类对象时没有类型错误

Inheritance 通过Dart中的子类参数传递超类对象时没有类型错误,inheritance,types,dart,arguments,Inheritance,Types,Dart,Arguments,我很好奇为什么Dart在通过继承的类型参数传入超类时不将其标记为不正确的类型?将继承类型作为参数意味着继承类型的接口应该被使用,而超类可能没有。这好像是个虫子 举例如下: class类测试{ int i; } 无效a(对象x){ b(x);//ClassTest继承对象,但这并不意味着它具有相同的接口 } 无效b(类测试x){ x、 i=2;//a()可以传递一个非类型安全类以使其失败 } 这不会给我带来编辑器中的错误。我至少希望在通过测试之前,将“x”的警告转换为类测试?我不确定这是否是正常

我很好奇为什么Dart在通过继承的类型参数传入超类时不将其标记为不正确的类型?将继承类型作为参数意味着继承类型的接口应该被使用,而超类可能没有。这好像是个虫子

举例如下:

class类测试{
int i;
}
无效a(对象x){
b(x);//ClassTest继承对象,但这并不意味着它具有相同的接口
}
无效b(类测试x){
x、 i=2;//a()可以传递一个非类型安全类以使其失败
}
这不会给我带来编辑器中的错误。我至少希望在通过测试之前,将“x”的警告转换为类测试?我不确定这是否是正常的行为,但我经常遇到这种情况


感谢阅读。

这不是一个bug,而是一个特性。见:

Dart在这里是不同的。它有一个叫做“分配兼容性”的东西来确定哪些分配是有效的。大多数语言只是使用正常的子类型规则:如果从子类型分配到超类型,则分配是安全的。Dart的分配兼容性规则还允许从超级类型分配到子类型

换句话说,您可以在赋值中隐式地向下转换,而不需要任何类型的显式转换。所以这里没有静态警告。但是,如果您在checked模式下运行代码,而downcast结果是无效的(正如这里所示),那么当您尝试将double分配给x时,您将在运行时收到一个类型错误


哦,对了,所以这个“特性”可以用一个潜在的IDE错误来交换一个潜在的运行时错误?因此,通过将其作为语言的一部分进行验证,我认为IDE现在将尝试在未来的迭代中进行类型推断,以使其更安全?由于Dart是可选类型的,并且我无法在此实例中显式设置类型(因为Object是主要的超类),因此我希望可以选择查看标记的潜在类型错误,而无需编写
if(x是ClassTest)
或执行反射。有人知道Dart将来会不会这样吗?我不知道有这样的选择。别客气,这太糟糕了。无论是严格的规则还是结构子类型(duck类型),都至少会给您提供处理此问题的选项,但Dart似乎只是在类型系统中留下了一个巨大的漏洞。