You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取继承Struct(ffi)的泛型参数的大小?

解决Dart泛型中sizeOf<T>()无法使用类型参数的问题

问题本质

你碰到的核心矛盾是:sizeOf<T>()是编译期常量函数,必须在编译阶段就明确传入的具体类型;但Dart的泛型采用类型擦除机制,泛型参数T只有在运行时才会绑定具体类型,编译期编译器无法确定T的实际类型,因此报错。

可行解决方案

方案1:实例化时传入预计算的size值

把sizeOf<具体Struct>的计算提前到创建Test实例的环节——此时你必须指定具体的Struct类型,编译期能正常计算出size:

import 'dart:ffi';

class Test<T extends Struct> {
  final int _structSize;

  // 构造时传入提前计算好的size
  Test(this._structSize);

  int sizeOfT() {
    return _structSize;
  }
}

// 自定义Struct示例
class MyStruct extends Struct {
  @Int32()
  external int value;
}

// 使用方式
void main() {
  final test = Test<MyStruct>(sizeOf<MyStruct>());
  print(test.sizeOfT()); // 输出4(Int32的大小)
}

方案2:为每个具体Struct创建Test子类

如果不想每次实例化都手动传size,可以给每个Struct写对应的Test子类,在子类里直接硬编码sizeOf<具体Struct>:

import 'dart:ffi';

abstract class Test<T extends Struct> {
  int sizeOfT();
}

class MyStruct extends Struct {
  @Int32()
  external int value;
}

class MyStructTest extends Test<MyStruct> {
  @override
  int sizeOfT() {
    return sizeOf<MyStruct>();
  }
}

// 使用方式
void main() {
  final test = MyStructTest();
  print(test.sizeOfT()); // 输出4
}

方案3:给Struct子类添加静态size常量

在自定义的Struct子类里定义静态size常量,后续通过传入获取常量的函数来拿到size:

import 'dart:ffi';

class MyStruct extends Struct {
  @Int32()
  external int value;

  // 提前定义静态size常量
  static const int size = sizeOf<MyStruct>();
}

class Test<T extends Struct> {
  final int Function() _sizeGetter;

  // 构造时传入获取size的函数
  Test(this._sizeGetter);

  int sizeOfT() {
    return _sizeGetter();
  }
}

// 使用方式
void main() {
  final test = Test<MyStruct>(() => MyStruct.size);
  print(test.sizeOfT()); // 输出4
}

内容的提问来源于stack exchange,提问作者Khan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 07:12:48