Как исправить «непроверенное приведение из MyClass в T» - PullRequest
1 голос
/ 28 мая 2019

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

  • В этом методе я вызываю метод:
    <T extends SonarContainPaging> T getSonarObjectFromPage(String url, Map<String, Object> uriVariables, Class<T> klass, List<T> page)
    Это возвращает объект, который расширяет SonarContainPaging.

  • Я пытаюсь добавить объект, который расширяет SonarContainPaging, в мой список, но я получаю предупреждение.

  • Объект SonarContainPaging имеет метод canContinuePaging, который принимает целое число страницы и возвращает логическое значение.


Предупреждение:

Тип безопасности: непроверенное приведение от SonarContainPaging к T

private <T extends SonarContainPaging> void getSonarListContainingPaging(String url, Map<String, Object> uriVariables, 
        Class<T> klass, List<T> list) {
    int page = 1;
    SonarContainPaging sonarObject = getSonarObjectFromPage(url, uriVariables, klass, page);
    page++;

    list.add((T)sonarObject); // Warning
    while (sonarObject.canContinueLooping(page)) {
        sonarObject = getSonarObjectFromPage(url, uriVariables, klass, page);
        page++;

        list.add((T) sonarObject); // Warning
    }
}

Любое решение, которое вы можете придумать?


Решение, данное @Sweeper, состоит в том, чтобы изменить тип sonarObject на T
Я допустил ошибку, предполагая, что универсальный объект T не может вызвать метод от своего родителя.

Ответы [ 4 ]

2 голосов
/ 28 мая 2019

Решение состоит в том, чтобы использовать T в качестве типа здесь, а затем вы можете удалить ваши приведения:

// before:
// SonarContainPaging sonarObject = getSonarObjectFromPage(url, uriVariables, klass, page);
// after:
T sonarObject = getSonarObjectFromPage(url, uriVariables, klass, page);

Поскольку, согласно вашему комментарию, getSonarObjectFromPage возвращает T, где T - это класс, в котором вы передаете его:

<T extends SonarContainPaging> T getSonarObjectFromPage(String url, Map<String, Object> uriVariables, Class<T> klass, List<T> page)

В этом случае вы передали класс klass, который является Class<T>, поэтому getSonarObjectFromPage также вернет T.

1 голос
/ 28 мая 2019

Как уже упоминалось Sweeper в их ответ , вы можете просто изменить тип sonarObject на T:

T sonarObject;

Вы также можете улучшить свой код, используяdo-while цикл, который уменьшает избыточность:

private <T extends SonarContainPaging> void getSonarListContainingPaging(String url, Map<String, Object> uriVariables, Class<T> klass, List<T> list) {
    int page = 1;
    T sonarObject;
    do {
        sonarObject = getSonarObjectFromPage(url, uriVariables, klass, page);
        list.add(sonarObject);
    } while (sonarObject.canContinueLooping(++page));
}
0 голосов
/ 28 мая 2019

Вы можете использовать метод приведения. https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html#cast-java.lang.Object-

list.add (klass.cast (sonarObject));

0 голосов
/ 28 мая 2019

Существует два способа избежать этого предупреждения.

Первый - привести объект к классу:

public static <T> T castMe(Class<T> clazz, Object object) {

    return clazz.cast(object);
}

Второй - подавить предупреждение с помощьюаннотаций.Это немного неуверенный способ, но его можно безопасно использовать, когда вы абсолютно уверены, что этот конкретный объект может быть приведен к рассматриваемому универсальному типу:

@SuppressWarnings("unchecked")
public static <T> T castMe(Class<T> clazz, Object object) {

    return (T) object;
}
...