Dart抽象原语的实现
我在查看基本dart类型(double、int、String等)的实现时,发现其中许多类都是Dart抽象原语的实现,dart,primitive-types,Dart,Primitive Types,我在查看基本dart类型(double、int、String等)的实现时,发现其中许多类都是abstract。我想知道这些类是否是抽象的,那么是哪个类实现了它们?当这些类甚至无法实例化时,如何将对象分配给特定类型?比如说, double作为一个抽象类我不能像这样实例化它 var d = double(); 但那怎么办呢 var d = 2.5; print(d is double); 打印true?dart如何知道d是double的对象?dart平台库分为您正在查看的公共共享代码和内部平台相
abstract
。我想知道这些类是否是抽象的,那么是哪个类实现了它们?当这些类甚至无法实例化时,如何将对象分配给特定类型?比如说,
double
作为一个抽象类
我不能像这样实例化它
var d = double();
但那怎么办呢
var d = 2.5;
print(d is double);
打印
true
?dart如何知道d
是double
的对象?dart平台库分为您正在查看的公共共享代码和内部平台相关代码(“补丁文件”),它们为声明为外部
的功能提供实现,它还提供了平台所依赖的其他内部机制(然后还有运行时系统的内部机制)
这些特定于平台的文件包含类的声明,这些类实现了int
和String
等类型。该规范指出,您不能将int
和String
子类化,但运行时系统仍然会这样做。“基元”对象是抽象接口的那些隐藏子类的实例
运行时系统可以(并且确实)进一步优化其中一些类的表示。例如,VM有一个名为
Smi
(“小整数”)的int
子类型,它将值存储在指针中,而不是在堆中分配对象,web平台将int
实现为一个普通JavaScript数字。当您对这些值调用方法时,它们必须特别处理这些值,因为它们的结构与其他对象不同。但这是一种优化,您可以认为这些值只是由内部隐藏类实现的。编译器从int
或double
文本内部构造int
和double
对象。(因此它们是“原语”。)从那里,它们由其他算术运算或显式.toInt()
或.toDouble()
转换的结果生成。通过int()
或double()
构建它们没有多大意义;它有什么价值?如果您尝试将它们添加到其他数字中,会发生什么情况?我不想使用构造函数创建原语,只是想了解它在没有任何构造函数的情况下是如何工作的……您混淆了用户级界面(即Dart程序的API)和语言实现。语言实现不需要使用相同的接口;实现可以用完全不同的语言编写。