Rémi Rousselet
Rémi Rousselet

Reputation: 276997

How to capture the generic type of a generic constraint?

Consider the following generic class:

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

How can I obtain the generic argument of Bar at compile time?

I would expect the following code to print int, but it prints 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());
}

I know I could do:

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

But I would like to define the Foo class using a single generic parameter instead of two.

Upvotes: 3

Views: 82

Answers (1)

R&#233;mi Rousselet
R&#233;mi Rousselet

Reputation: 276997

This is currently not possible to do on any class.

There's currently a pending feature request on Dart to support such use-case: https://github.com/dart-lang/language/issues/620

It's worth noting that there's a workaround if you can add a method on the class concerned.

For example, say you have a generic class Model<T>:

class Model<T> {
  T value;
}

Then you can add a "capture" method as such:

class Model<T> {
  T value;

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

This then allows you to write:

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

Upvotes: 2

Related Questions