Передать объект с динамически определяемым параметром типа в метод с двумя аргументами, оба аргумента которого имеют один и тот же параметр типа

Скажем, у меня есть функция 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, что и определено в параметре типа уровня класса. Так разве у них не гарантирован один и тот же параметр типа?

Проблема в другом?

Заранее благодарим за то, что добрались до конца.

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

Andrew S 17.07.2018 17:25

Вот мой друг, ограниченные символы подстановки. stackoverflow.com/questions/3009745/…

kidnan1991 17.07.2018 17:34

Да, овеществите тип.

Johannes Kuhn 17.07.2018 21:20

@AndrewS, почему это сработает? Какой бы тип конфигурации не был (обозначен знаком?), Он будет одинаковым для его сегментов и групп .. так почему же использование T должно иметь значение

mave_rick 18.07.2018 06:51

Моя основная мысль заключается в том, что в рамках функции execute объект config определяется с помощью определенного параметра типа, поэтому его поля buckets и groups имеют тот же параметр, и я передаю их функции myFunc. Значит, они гарантированно одного типа, верно? Я ошибаюсь, говоря это? Если нет, то почему компилятор этого не видит?

mave_rick 18.07.2018 11:07

Нет, они не одного типа. Этот - хорошее объяснение.

Andrew S 18.07.2018 14:54

Нет, я понимаю List <? extends Number> доступен только для чтения. Но это отдельная тема. Как бы то ни было, я продолжу читать

mave_rick 18.07.2018 15:02
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
7
384
0

Другие вопросы по теме