Скажем, у меня есть функция utils:
public static <T extends Number> double myFunc(List<T> a1, List<T> a2) {...}
Далее у меня есть класс:
class Config<T extends Number>{
public List<T> buckets;
public List<T> groups;
}
Ну наконец то, Я хочу написать такую функцию:
double execute(Config<? extends Number> config){
//Some stuff
myFunc(config.buckets, config.groups)
}
Однако это дает мне ошибку времени компиляции: «Метод myFunc (List <T>, List <T>) не применим для аргументов (List <capture # 1-of? Extends Number>, List <capture # 2- из? расширяет номер>) ".
Я догадываюсь, почему компилятору это не нравится. По сути, myFunc требует, чтобы оба списка аргументов имели один и тот же параметр типа T extends Number, но я поставляю ? extends Number для обоих, поэтому у него нет возможности гарантировать, что оба будут быть параметром того же типа? (Я столкнулся с этой ошибкой, поэтому я предполагаю, что она тоже виновата ..) Но я использую те же поля Config<? extends Number> config и buckets объекта groups, которые, если вы видите определение класса, имеют тот же тип T, что и определено в параметре типа уровня класса. Так разве у них не гарантирован один и тот же параметр типа?
Проблема в другом?
Заранее благодарим за то, что добрались до конца.
Вот мой друг, ограниченные символы подстановки. stackoverflow.com/questions/3009745/…
Да, овеществите тип.
@AndrewS, почему это сработает? Какой бы тип конфигурации не был (обозначен знаком?), Он будет одинаковым для его сегментов и групп .. так почему же использование T должно иметь значение
Моя основная мысль заключается в том, что в рамках функции execute объект config определяется с помощью определенного параметра типа, поэтому его поля buckets и groups имеют тот же параметр, и я передаю их функции myFunc. Значит, они гарантированно одного типа, верно? Я ошибаюсь, говоря это? Если нет, то почему компилятор этого не видит?
Нет, они не одного типа. Этот - хорошее объяснение.
Нет, я понимаю List <? extends Number> доступен только для чтения. Но это отдельная тема. Как бы то ни было, я продолжу читать




Это проблема, которую вы описали. Попробуйте изменить подпись метода на
public <T extends Number> double execute(Config<T> config).