Переопределение метода Java, подкласс, принимающий супертип типа параметра

В java мы можем сузить тип возвращаемого значения и тип исключения throws (или даже стереть предложение throws):

abstract class A
{
  abstract CharSequence getName() throws NameNotAvailableException;
}

class B extends A
{
  String getName()
  {
    return "foo";
  }
}

Но как насчет типов параметров (если A принимает T, то почему B не принимает ? super T), как в:

abstract class A
{
  abstract void setName(final String name);
}

class B extends A
{
  void setName(final CharSequence name)
  {

  }
}

Давайте рассмотрим этот фрагмент кода, который, как мне кажется, полностью логичен для меня:

void handleA(final A a)
{
  a.setName("foo");
}

handleA(new B());

Итак, я говорю, что B все еще действителен в контексте кода, использующего A.

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

Codebender 02.05.2018 14:22
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
1
60
1

Ответы 1

Потому что CharSequence - это не только String, а String - это CharSequence. Другими словами, CharSequence также может быть CharBuffer, Segment, String, StringBuffer, StringBuilder.

Вот почему вы не можете изменить тип параметра setName(String) на CharSequence.

Другие вопросы по теме