@synapse_people

Как сделать правильно генерики?

Есть 2 интерфейса:
Первый:
public interface ArgsConverter<D> {

	public void prepare(...);

	public D conv(...., Object[] args );
}

задача-получить массив аргументов и превратить его в объект.
Второй:
public interface Callback<D> {

	MethType getMethodType();

	Class<D> getDataObjectClass();

	ArgsConverter<D> conv();

	Object execute(D data);
}


Есть коллекция, которая состоит из <Callback<? extends Object>>
то есть всевозможные колбеки в куче... Находим нужный колбек - проблем нет, вынимаем его
и получаем проблему type-safety. Хотя колбек и определяет тип данных, которые принимает на вход, а также, определяет конвертер, который нужно использовать - предупреждение type-safe все равно вылетает!
Callback<? extends Object> cb = CALLBACKS.stream....;

		// convert ARRAY of arguments to DATA OBJECT

		return cb.execute(cb.conv().conv( args));

Ошибка:
The method execute(capture#4-of ? extends Object) in the type Callback<capture#4-of ? extends Object> is not applicable for the arguments (capture#5-of ? extends Object)

Кто нить может подсказать - почему так происходит и как решить проблему БЕЗ костыля с @SuppressWarnings("rawtypes")
Я так понимаю все дело в том, как хранится коллекция, а также в том, что wildcard коллекции не совпадает с тем, который указан на переменной (?)
Или в чем дело вообще
Подскажите)
  • Вопрос задан
  • 113 просмотров
Решения вопроса 1
@Codebaker
Всё умею, всё могу!
Зачем вы заставляете клиентский код делать за вас всю работу?
Зачем наружу торчит ArgsConverter conv(); у коллбэка?
Попробуйте переписать свой execute вот в это:

public Object execute(Object[] args) {
    ArgsConverter<?> convImpl = conv();
    return convImpl.conv(args);
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы