Обнаружение предупреждения о безопасности типа при использовании Generics - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть класс, который выглядит следующим образом.

class SuperClass<T> {
    public <K extends ClassB> K someMethod(T t) {
        return null;
    }
}

class ClassB {

}

class ClassA extends ClassB {

}

class ClassC {

}


public class Main extends SuperClass<ClassC>{
    @Override
    public ClassA someMethod(ClassC c) { //type safety warning in ClassA
        return null;
    }
}

Насколько я понимаю, типом возврата someMethod() может быть любой класс, который расширяет ClassB или ClassB. Ясно, что ClassA - это ClassB. В чем проблема и почему я получаю предупреждение о безопасности типа?

1 Ответ

0 голосов
/ 06 ноября 2018
public <K extends ClassB> K someMethod(T t) {
    return null;
}

Вы даете гарантию звонящим здесь. Вы говорите им: «Независимо от того, с каким подклассом SuperClass мы работаем, этот метод вернет значение, которое можно безопасно рассматривать как любой подкласс ClassB». Тогда ваш подкласс Main приходит и нарушает это обещание, делая версию, которая возвращает только ClassA, что является прямым нарушением заключенного вами контракта. Общие объявления extends / super являются обещаниями для вызывающей стороны , а не для лица, расширяющего код.

...