Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/41: Рейтинг темы: голосов - 41, средняя оценка - 4.54
 Аватар для lignium
4 / 4 / 3
Регистрация: 17.11.2015
Сообщений: 57

Проблема с дженериками (The method is not applicable for the arguments)

03.07.2019, 01:50. Показов 8638. Ответов 16

Студворк — интернет-сервис помощи студентам
Здравствуйте! Столкнулся с никак не разрешимой проблемой (почти никак), связанной с использованием дженериков.

Есть два интерфейса - Region и Visualization:

1. Region имеет параметр R, который используется в некоторых методах, не перечисленные здесь.
2. У интерфейса Visualization есть метод visualize, которые выполняет некоторые действия используя заданный регион. Параметр интерфейса R задает конкретный класс региона, для которого предназначена эта визуализация.

Есть некоторый код, который получил из менеджеров неизвестный регион и визуализацию, при этом известно, что регион точно подходит для этой визуализации. Задача выполнить метод visualize у экземпляра неизвестного класса Visualization<?>, передав в его параметры Region<?>, также с неизвестной реализацией.

Очень надеюсь на вашу помощь. Единственное что я смог придумать - обрезать дженерики в вызывающем коде, чтобы были просто Region и Visualization, и получить просто два предупреждения - unchecked и rawtypes. Однако мне принципиально чтобы rawtypes не было (чистота кода все дела).

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public final class Experiment {
    private static interface Region<R extends Region<R>> {}
    
    private static interface Visualization<R extends Region<R>> {
        void visualize(R region);
    }
    
    // Реализации интерфейсов для примера
    
    private static final class CuboidRegion implements Region<CuboidRegion> {}
    
    private static final class CuboidVisualization implements Visualization<CuboidRegion> {
        @Override
        public void visualize(CuboidRegion region) {}
    }
    
    public static void main(String[] arguments) {
        // Реализации этих классов неизвестны, однако точно известно, что эти классы
        // совместимы между собой
        
        Region<?> region = new CuboidRegion();
        Visualization<?> visualization = new CuboidVisualization();
        
        // Ошибка компиляции:
        //
        // The method visualize(capture#1-of ?) in the type
        // Experiment.Visualization<capture#1-of ?> is not applicable for the arguments
        // (Experiment.Region<capture#2-of ?>)
        
        visualization.visualize(region);
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.07.2019, 01:50
Ответы с готовыми решениями:

ОшибкаThe method convertTemp(int, char) in the type TemperatureConverter is not applicable for the arguments
public class TemperatureConverter { public char convertTemp(int temperature,char convertTo){ int x; x = 55; if...

Проблема с дженериками, немогу указать верхнюю границу
Интерфейс: public interface Strategy&lt;K extends String,V extends Integer,T extends Map&lt;K,V&gt;, R extends GameFigures&gt;{ public R...

Undefined function or method ' ' for input arguments of type 'double'
Требуется по нажатию кнопки нарисовать график. Но выдаёт ошибку Undefined function or method 'btngraf' for input arguments of type...

16
 Аватар для Goongala
1022 / 562 / 185
Регистрация: 18.08.2013
Сообщений: 2,027
Записей в блоге: 2
03.07.2019, 03:23
Поясните что эт по-вашему должно означать
Java
1
private static interface Region<R extends Region<R>> {}
0
 Аватар для lignium
4 / 4 / 3
Регистрация: 17.11.2015
Сообщений: 57
03.07.2019, 03:43  [ТС]
Цитата Сообщение от Gungala Посмотреть сообщение
Поясните что эт по-вашему должно означать
Java
1
private static interface Region<R extends Region<R>> {}
Используется чтобы некоторые методы у реализации возвращали не какой-то там Region, а измененный экземпляр класса реализации CuboidRegion. Если вызывать такие методы у неизвестного региона, вернется также неизвестный регион Region<?>. Как то так.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
private static interface Region<R extends Region<R>> {
    R mutate(int parameter);
}
 
private static final class CuboidRegion implements Region<CuboidRegion> {
    @Override
    public CuboidRegion mutate(int parameter) {
        // Все Region'ы являются immutable, этот метод допустим что-то изменяет и
        // возвращает новый экземпляр CuboidRegion.
        
        return null;
    }
}
0
 Аватар для Goongala
1022 / 562 / 185
Регистрация: 18.08.2013
Сообщений: 2,027
Записей в блоге: 2
03.07.2019, 03:54
lignium, прост ты при объявлении Region указываешь, что в качестве дженерика он принимает классы, которые уже реализуют Region. Мне чёт это не понятно

Добавлено через 3 минуты

Не по теме:

И мне чёт кажется, что ты не совсем ясно понимаешь значения слов, которые используешь

0
03.07.2019, 04:01  [ТС]

Не по теме:

Цитата Сообщение от Gungala Посмотреть сообщение
И мне чёт кажется, что ты не совсем ясно понимаешь значения слов, которые используешь
Например, каких?

0
 Аватар для Goongala
1022 / 562 / 185
Регистрация: 18.08.2013
Сообщений: 2,027
Записей в блоге: 2
03.07.2019, 04:06
lignium, та неважн, ты лучше поясни каким образом эт вообще должно работать. Ты пишешь, что CuboidRegion implements Region<CuboidRegion>, но эт не подходит под интерфейс Region, ибо он требует, чтобы реализующий класс уже имплементировал Region

Добавлено через 1 минуту
Что мешает сделать дженерик Region просто R
0
 Аватар для lignium
4 / 4 / 3
Регистрация: 17.11.2015
Сообщений: 57
03.07.2019, 04:13  [ТС]
Цитата Сообщение от Gungala Посмотреть сообщение
поясни каким образом эт вообще должно работать
Вы наверное удивитесь, но это еще как работает. На мой стыд, я не помню как это называется. Наверное что-то вроде "рекурсивные дженерики". Очень удобно, когда в интерфейсе/абстрактном классе нужно указать именно класс реализации этого интерфейса в параметрах или как возврат.
0
 Аватар для Goongala
1022 / 562 / 185
Регистрация: 18.08.2013
Сообщений: 2,027
Записей в блоге: 2
03.07.2019, 04:55
Акей, видимо, вопрос вне моей компетенции
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
03.07.2019, 05:00
я так и не пойму, чего ты хочешь добиться.
0
 Аватар для lignium
4 / 4 / 3
Регистрация: 17.11.2015
Сообщений: 57
03.07.2019, 16:24  [ТС]
Цитата Сообщение от xoraxax Посмотреть сообщение
я так и не пойму, чего ты хочешь добиться.
Если очень коротко - исправить ошибку компиляции в строке 30 так, чтобы при этом не было raw-типов, но допускается предупреждение "unchecked" (от него отвертеться в любом случае не получится).
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,765
03.07.2019, 20:47
Цитата Сообщение от Gungala Посмотреть сообщение
Ты пишешь, что CuboidRegion implements Region<CuboidRegion>, но эт не подходит под интерфейс Region, ибо он требует, чтобы реализующий класс уже имплементировал Region
Добавлено через 1 минуту
Что мешает сделать дженерик Region просто R
Открой, например, исходник java.lang.Enum и посмотри.

http://www.angelikalanger.com/... tml#FAQ206

Цитата Сообщение от lignium Посмотреть сообщение
На мой стыд, я не помню как это называется. Наверное что-то вроде "рекурсивные дженерики".
self-referential generic types

Добавлено через 1 минуту
Java
1
2
        Region<CuboidRegion> region = new CuboidRegion();
        Visualization<CuboidVisualization> visualization = new CuboidVisualization();
не?
1
 Аватар для lignium
4 / 4 / 3
Регистрация: 17.11.2015
Сообщений: 57
03.07.2019, 22:08  [ТС]
Цитата Сообщение от korvin_ Посмотреть сообщение
self-referential generic types
Спасибо за информацию.

Цитата Сообщение от korvin_ Посмотреть сообщение
не?
Нет. Как я и написал выше, конкретный класс региона у этих двух объектов неизвестен, но известно что они совместимы (у Visualization есть метод getRegionClass, выполняется проверка на равенство). Реализации этих двух классов в коде там для примера стоят, чтобы код компилировался и запускался в случае успеха.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,765
03.07.2019, 22:21
Цитата Сообщение от lignium Посмотреть сообщение
конкретный класс региона у этих двух объектов неизвестен
Как это не известен? Курсор наведи на конструктор, что IDE показывает?
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
03.07.2019, 22:23
lignium, кажется ты хочешь погуглить bridge design pattern
0
 Аватар для lignium
4 / 4 / 3
Регистрация: 17.11.2015
Сообщений: 57
03.07.2019, 22:50  [ТС]
Цитата Сообщение от korvin_ Посмотреть сообщение
Как это не известен? Курсор наведи на конструктор, что IDE показывает?
Опять же говорю, я написал это тут чисто для примера. Эти данные я получаю через специальные менеджеры, там методы возвращают Region<?> и Visualization<?> для определенного игрока, конкретные реализации не известны, да и знать их не надо.
0
 Аватар для Goongala
1022 / 562 / 185
Регистрация: 18.08.2013
Сообщений: 2,027
Записей в блоге: 2
04.07.2019, 07:16

Не по теме:

Мне кажется, было бы проще прост через наследование сделать



Добавлено через 30 минут

Не по теме:

Цитата Сообщение от korvin_ Посмотреть сообщение
Открой, например, исходник java.lang.Enum и посмотри.
http://www.angelikalanger.com/... tml#FAQ206
Чёт как-то совсем сложно. Получается, это делается для того, чтобы при расширении в качестве дженерика указывался создаваемый класс? Например class A extends Super<A>

0
 Аватар для lignium
4 / 4 / 3
Регистрация: 17.11.2015
Сообщений: 57
18.10.2019, 20:58  [ТС]
Значится так...

Я решил проблему, вернее понял почему она возникает. Дело в том, что класс Visualization имеет уточнение о типе региона, для которого он предназначен, а также метод Visualization#visualize(R) который я пытаюсь вызывать имеет не какой-то там регион, а вполне конкретный - R. То есть метод класса запрашивает вполне конкретный тип, в соответствии с контекстом выполнения. У Visualization<?> контекста нет, так как тип региона нам неизвестен. Java не может проверить правильный ли мы регион передаем. Методом экспериментов удалось выяснить, что это стандартный механизм защиты, чтобы невозможно было передать не известно что в метод класса с неизвестным контекстом. Решения тут два, либо заглушить предупреждения и использовать голые типы и написать @SuppressWarnings({"rawtypes", "unchecked"}), либо же преобразовать сигнатуру метода для использования любого региона, а проверку дополнительную придется делать на стороне этого метода. Другое дело что это код реального времени, и я не могу себе позволить выполнять тяжелые операции по типу instanceof или Class#isInstance(Object), но это уже другая история...

Странно почему я до этого раньше не додумался. Догадался уже тогда, когда хотел недавно создать похожий метод с таким вот аргументом с сюрпризом. Врезалась в голову мысль, а как же Java то проверит это дело?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.10.2019, 20:58
Помогаю со студенческими работами здесь

Ошибка: Undefined function or method 'sq' for input arguments of type 'double'
Ошибка: Undefined function or method 'sq' for input arguments of type 'double' clear all ; clc; T=5; % временной отрезок tp=5e-2;...

Undefined function or method 'plo' for input arguments of type 'double'
Прошу проверить программу.http://imgur.cоm/a/4EсFD Задание №3.Вот код.Вопрос:@??? Undefined function or method 'plo' for input ...

Ошибка: Undefined function or method 'lsqr' for input arguments of type 'double'
&gt;&gt; A= A = 10 12 15 45 78 98 &gt;&gt; B= B =

Выдает ошибку:Undefined function or method 'f' for input arguments of type 'double'
2 проблемы, использую мат лаб R2010b очень нужна помощь, заранее спасибо !!! люди, мне нужно создать m-file, но там такого нету, в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru