Dart抽象原语的实现

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平台库分为您正在查看的公共共享代码和内部平台相

我在查看基本dart类型(double、int、String等)的实现时,发现其中许多类都是
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)和语言实现。语言实现不需要使用相同的接口;实现可以用完全不同的语言编写。