abstract class A {}

abstract class B {
  call<T>();
}

class C implements B {
  call<T>() => print(T);
}

class Wrapper {
  Wrapper(this.b, this.call);
  final B b;
  final B call;
}

void main() {}
