@sanex3339

Как правильно указать тип аргумента callback без каста?

Допустим есть коллбэк
private void callback (Map<String, Color> data) {
       Color color = data.get("color");
}

который передается аргументом в метод
new RenderThreadsController<>(this::callback);
В методе этот аргумент-коллбэк имеет тип-интерфейс
@FunctionalInterface
public interface Callback <T> {
    void callback (Map<String, T> data);
}

И вызывается соответственно
Map<String, T> data = new HashMap<>();
        data.put(
            "color",
            (T) new Color(
                random.nextInt(255),
                random.nextInt(255),
                random.nextInt(255)
            )
        );
this.callback.callback(data);


Соответственно вопрос - можно каким либо образом сделать это без каста Color к T?
(T) new Color(
                random.nextInt(255),
                random.nextInt(255),
                random.nextInt(255)
            )
  • Вопрос задан
  • 166 просмотров
Решения вопроса 1
angry_cellophane
@angry_cellophane
Map<String, T> data = new HashMap<>();
        data.put(
            "color",
            (T) new Color(
                random.nextInt(255),
                random.nextInt(255),
                random.nextInt(255)
            )
        );
this.callback.callback(data);

В этот момент тип в мапе известен, поэтому смысла параметризовать тип значения нет, лучше явно указать тип Color, т.е. Map data = new HashMap<>();
Если мапа может содержать value разных типов, то можно воспользоваться советом от Джошуа Блоха - idlebrains.org/tutorials/java-tutorials/effective-...
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@onepavel
Консультация и разработка мобильных приложений
в java есть такая штука, как Wildcards
<? extends T>
<? super T>
Ответ написан
Ваш ответ на вопрос

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

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