如何捕获泛型约束的泛型类型?

时间:2019-06-13 11:38:13

标签: dart

考虑以下通用类:

class Foo<T extends Bar<dynamic>> {}

如何在编译时获取Bar的通用参数?

我希望以下代码可以打印int,但它可以打印dynamic

class Bar<T> {}

class Foo<T extends Bar<dynamic>> {
  Foo(this.value) {
    _debugBarType(value);
  }

  final T value;

  void _debugBarType<A>(Bar<A> value) {
    print(A);
  }  
}

void main() {
  Foo<Bar<int>>(Bar());
}

我知道我可以做到:

class Foo<A, Bar<A>> {}

但是我想使用一个通用参数而不是两个来定义Foo类。

1 个答案:

答案 0 :(得分:1)

目前在 any 类上是不可能的。

Dart上目前有一个待处理的功能请求来支持这种用例:https://github.com/dart-lang/language/issues/620

值得注意的是,如果可以在相关类上添加方法,则有一种解决方法。

例如,假设您有一个通用类Model<T>

class Model<T> {
  T value;
}

然后,您可以添加“捕获”方法,如下所示:

class Model<T> {
  T value;

  R capture<T>(void cb<P>(P value)) => cb<T>(value);
}

然后,您可以这样写:

void someFunction<T extends Model<dynamic>>(T model) {
  model.capture(<P>(value) {
    // `P` will be the captured type instead of `dynamic`
  });
}