Как набрать определение универсальной функции? - PullRequest
0 голосов
/ 29 июня 2018

У меня есть общий статический метод, который выглядит следующим образом:

static build<K>() {
    return (GenericClass<K> param) => MyClass<K>(param);
}

Пока я пробовал:

typedef F = MyClass<K> Function(GenericClass<K> param);

но это говорит о том, что:

The return type '(GenericClass<K>) → MyClass<K>' isn't a '(GenericClass<dynamic>) → MyClass<dynamic>', as defined by the method 'build'.

и

typedef F = SimpleViewModel<K> Function<k>(Store<K> param);

Что говорит о том, что:

The return type '(GenericClass<K>) → MyClass<K>' isn't a '<K>(GenericClass<K>) → MyClass<K>', as defined by the method 'build'.

MyClass выглядит так:

class MyClass<T> {
  final GenericClass<T> param;

  MyClass(this.param);


  static build<K>() {
      return (GenericClass<K> param) => MyClass<K>(param);
  }
}

Итак, что является действительным typedef для него?

1 Ответ

0 голосов
/ 29 июня 2018

Есть два понятия «универсальный», когда дело доходит до определения типа. Typedef может быть универсальным для типа, или typedef может ссылаться на универсальную функцию (или обе):

typedef, общий для T:

typedef F<T> = T Function(T);

Тогда в использовании:

F first = (dynamic arg) => arg; // F means F<dynamic>
F<String> second = (String arg) => arg; // F<String> means both T must be String

typedef, который ссылается на универсальную функцию в M:

typedef F = M Function<M>(M);

Тогда в использовании:

F first = <M>(M arg) => arg; // The anonymous function is defined as generic
// F<String> -> Illegal, F has no generic argument
// F second = (String arg) => arg -> Illegal, the anonymous function is not generic

Или оба:

typedef F<T> = M Function<M>(T,M);

И в использовании:

F first = <M>(dynamic arg1, M arg2) => arg2; // F means F<dynamic> so the T must be dynamic
F<String second = <M>(String arg1, M arg2) => arg2; // The T must be String, the function must still be generic on the second arg and return type
...