Гость
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Как правильно сделать Cast / 4 сообщений из 4, страница 1 из 1
15.02.2021, 17:08
    #40045540
Mixrud
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно сделать Cast
Коллеги, как правильно сделать cast, чтобы погас Unchecked cast warning
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    final private HashMap<Class<? extends ListItem>, DbContext<? extends ListItem>> _cache;

    public <T extends ListItem> List<T> Query(@NotNull Class<T> actualClass) throws Exception {
        DbContext<T> result;
        if (!_cache.containsKey(actualClass)) {
            result = new DbContext<>(actualClass);
            _cache.put(actualClass, result);
        } else
            result = (DbContext<T>) _cache.get(actualClass);
        return result.query();
    }
...
Рейтинг: 0 / 0
17.02.2021, 19:21
    #40046406
Lelouch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно сделать Cast
Zzz79
Mixrud
Коллеги, как правильно сделать cast, чтобы погас Unchecked cast warning
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    final private HashMap<Class<? extends ListItem>, DbContext<? extends ListItem>> _cache;

    public <T extends ListItem> List<T> Query(@NotNull Class<T> actualClass) throws Exception {
        DbContext<T> result;
        if (!_cache.containsKey(actualClass)) {
            result = new DbContext<>(actualClass);
            _cache.put(actualClass, result);
        } else
            result = (DbContext<T>) _cache.get(actualClass);
        return result.query();
    }


никак в твоем случае,грубо говоря у тебя есть некий супер класс Animal
и два наследника CAT и DOG
по сути для компилятора твой каст выглядит как собака в кота,поэтому и горит варнинг


Вообще мимо.
Warn в данном случае связан с тем, что DbContext это generic.
В runtime типы-параметры получить нельзя, поэтому нет гарантий, что значение действительно будет содержать DbContext <T> , а не от какого-нибудь другого типа (такая ситуация называется Heap pollution (https://en.wikipedia.org/wiki/Heap_pollution))

И его в данном примере вообще нельзя убрать. Сам warn можно убрать, используя cast с wildcart параметром (e.g. DbContext <?> ), но, естественно, такое изменение сделает код некомпилируемым.

Так что просто использовать @SuppressWarning("unchecked") (если не путаю), если глаза мозолит
...
Рейтинг: 0 / 0
17.02.2021, 19:31
    #40046412
Lelouch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно сделать Cast
Zzz79
Lelouch
пропущено...


Вообще мимо.
Warn в данном случае связан с тем, что DbContext это generic.
В runtime типы-параметры получить нельзя, поэтому нет гарантий, что значение действительно будет содержать DbContext <T> , а не от какого-нибудь другого типа (такая ситуация называется Heap pollution (https://en.wikipedia.org/wiki/Heap_pollution))

И его в данном примере вообще нельзя убрать, не меняя остальной код. Сам warn можно убрать, используя cast с wildcart параметром (e.g. DbContext <?> ), но, естественно, такое изменение сделает код некомпилируемым.

Так что просто использовать @SuppressWarning("unchecked") (если не путаю), если глаза мозолит

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


Но warn не будет, если использовать типы без параметров) Если каст не выполнится, то будет ClassCastException в рантайме и все.
...
Рейтинг: 0 / 0
18.02.2021, 12:00
    #40046571
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно сделать Cast
Зачем имя поля с подчеркивания делать? В Java так не принято.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Как правильно сделать Cast / 4 сообщений из 4, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]