class A {}
class B extends A {}
void fA(A a) {}
void fB(B b) {}
final Map<String, void Function(A)> m = {'test': fB};
В приведенном выше примере назначение fA
на 'test'
работает, но fB
генерирует ошибку:
Тип элемента '(B) → void'
не может быть присвоен типу значения карты '(A) → void'
.
Есть ли способ указать, что тип значения - это функция, которая принимает параметр, который является или расширяется A
?
Я также пытался void Function<T extends A>(T)
, но это приводит к другой ошибке:
Универсальная функция не может быть аргументом типа.
Единственный способ, с помощью которого я нашел проект для компиляции, - это приведение значения при его присвоении, что, похоже, не соответствует цели проверки типа, поскольку тип значения также может быть dynamic
в этом случае:
final Map<String, void Function(A)> m = {
'test': fB as void Function(A),
};