为什么 Uint8List 与 dart 中的 list<int> 兼容?

Pro*_*ter 10 dart

我是飞镖新手。

我在学习 dart 时注意到的一件奇怪的事情是它Uint8List似乎与List<int>.

例如,该IOSink.read()方法接受 type 的数据List<int>作为参数。但它似乎也直接接受类型数据Uint8List作为参数。

这是一个什么样的机制呢?它并没有真正将tobyte中的每个都转换,不是吗?就效率和内存使用而言,这将是非常浪费的。Uint8Listint

lrn*_*lrn 13

Uint8List接口实现List<int>.

List<int>这意味着它具有与 兼容的签名的每个成员的实现List<int>。这也意味着它Uint8List是 的子类型List<int>,并且实例可以在允许或需要实例的Uint8List任何地方使用。List<int>

Uint8List实现起来很List<int>容易,因为 aUint8List是一个(有限的)整数列表,并且因为 Dart 只有一种整数类型 ,所以int区分“字节”和整数是没有问题的。

从 a 中读出的任何整数Uint8List都在 0..255 范围内。写入 a 的任何整数Uint8List在存储之前都会被截断为前 8 位。将整数 257 存储到一个中Uint8List意味着实际存储值为 1 的字节。

read方法可能只使用普通List方法将整数存储到缓冲区中。如果该缓冲区恰好是 a Uint8List,则这些整数将被截断并仅占用一个字节。List<int>如果不是,它只是像平常一样将整数(恰好在 0..255 范围内)存储到 a 中。