Решение изменит вашу сигнатуру вашего интерфейса:
double apply(Optional<? extends A> a);
Рассмотрим, если ваш интерфейс просто:
double apply(A a);
Тогда никогда ошибка не будет [. g3]
Это потому, что Double
назначается Object
. Компилятор автоматически адаптирует тип. Это означает, что на самом деле интерфейс:
double apply(? extends A a);
Итак, что вам нужно, это позволить вашему интерфейсу использовать эту способность адаптации.
func(Number)
может принимать параметр Double
в качестве параметра.
func(Optional<Number>)
также должен принять Optional<Double>
.
Итак, вы должны добавить ? extends
на свою интуицию.
Вы можете использовать сигнатуру конструктора:
class DownloadWorker {
constructor(downloader: new () => IDownloader) {
}
}
Сигнатура похожа на сигнатуру функции, но new
делает ее вызываемой с помощью оператора new
для создания нового объекта.
Приведенный выше код принимает конструктор (то есть класс) без параметров. Вы можете добавить определенные параметры или определить его как new (...a:any[]) => IDownloader
, чтобы позволить конструктору с любыми аргументами.