Вопрос по java, generics – Почему `T расширяет строку` разрешено, но выдает предупреждение? [Дубликат]

6

Возможный дубликат:

@SuppressWarnings для «расширяет строку »

ЗачемT extends String разрешено, но дает предупреждение?

Параметр типа T не должен быть ограничен конечным типом String. Окончательные типы не могут быть расширены

public class Car 

Я знаю, что является окончательным, я знаю, Это действительно, потому что только возможное значениеT can be String Мне было интересно о предупреждении.

@ Thor84no см. Отредактированный вопрос иaxtavt»ответ Raffaele
Предупреждающее сообщение говорит обо всем. Как вы можете придумать класс, который расширяетfinal Строка? ТакT определенно будетString Raffaele

Ваш Ответ

3   ответа
2

String в Яве, конечно, я. е. вы можете'расширить этот класс. Таким образом, у вас есть предупреждение, потому что не может существовать класс, расширяющий String.

ОП спрашивает, почему это разрешено делать? Jigar Joshi
13

Если актуальный вопрос "Почему это'разрешенозатем представьте ситуацию, когда вы добавляетеfinal Ключевое слово для существующего класса. Я думаю, что ты нене хочу, чтобы это изменение нарушило другой существующий код, который использует этот класс в качестве общего ограничения, потому чтовсе еще совершенно законно. Тот'почему компилятор не выдает ошибку в этом случае.

С другой стороны, вы хотите получать информацию, если вы случайно используетеfinal класс как родовой предел, потому что такойне имеет смысла. Тот'почему компилятор выдает предупреждение.

На самом деле этоРаспространена практика помечать юридические, но бессмысленные конструкции предупреждениями.

3

По сути, это говорит о том, что существует только один возможный типT и этоString сам. Так что в основном ваш общийCar класс является общим только по названию. Вы также можете просто заменить все экземплярыT в классе с.String

Возможно, вы имеете в видуpublic class Car ...


Конструкция допустима, потому что класс имеет смысл и, возможно, даже полезен. Предупреждение выдается потому, что (по мнению авторов компилятора) вы, вероятно, допустили ошибку. Аргументация та же, что и для предупреждения, которое некоторые компиляторы выдают вам за следующее:

String NULL = null;
System.err.println(NULL.toString());

Это имеет смысл, но это ошибка ... если вынамереваться это бросить исключение.


Я могу думать о двух сценариях, гдеpublic class Car не ошибка

  • Случай, когдаSomeFinalClass изначально не было.final
  • Случай, когда код дляCar генерируется автоматически, и было бы неудобно генерировать специальный код дляfinal классы.

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