Является ? super/extensions byte[] имеет смысл?

Я только что написал следующий метод.

static <R> R encodeBase16(final Supplier<? extends byte[]> supplier,
                          final Function<? super byte[], ? extends R> function) {
    requireNonNull(supplier, "supplier is null");
    requireNonNull(function, "function is null");
    return function.apply(encodeBase16(supplier.get()));
}

Пока у компилятора вроде нет проблем с этим.

Эти части ? extends byte[] и ? super byte[] имеют смысл? Или я могу просто использовать byte[]?

static <R> R encodeBase16(final Supplier<byte[]> supplier,
                          final Function<byte[], ? extends R> function) {
    requireNonNull(supplier, "supplier is null");
    requireNonNull(function, "function is null");
    return function.apply(encodeBase16(supplier.get()));
}

Ничего нельзя добавить к ответу @sweeper. В любом случае, на вашем месте я бы сохранил подстановочные знаки в вашем коде, потому что он соблюдает принцип PECS и, следовательно, имеет также цель документирования. Как только кто-то сможет реорганизовать byte[] в SomeCustomClass, тогда подстановочные знаки будут необходимы.

Tomáš Záluský 11.12.2020 15:11
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
87
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это отлично. Вы можете поместить любой тип ссылки после extends/super в подстановочном знаке. См. продукционное правило здесь:

TypeArguments:
  < TypeArgumentList >
TypeArgumentList:
  TypeArgument {, TypeArgument}
TypeArgument:
  ReferenceType 
  Wildcard
Wildcard:
  {Annotation} ? [WildcardBounds]
WildcardBounds:
  extends ReferenceType 
  super ReferenceType

Как вы знаете, использование подстановочных знаков позволяет использовать подтипы byte[] в качестве аргумента типа для подстановочного знака extends byte[] и супертипы byte[] в качестве аргумента типа для подстановочного знака super byte[]. Насколько я знаю, у byte[] нет подтипов, а есть только супертипы byte[]:

  • Object
  • Serializable
  • Cloneable

согласно этому. Так, например, вы можете передать Function<Object, R> этому методу:

Function<Object, String> function = x -> null;
encodeBase16(() -> null, function);

Это полезно? Я бы так не сказал, но вам разрешено делать неполезные вещи.

Связанный вопрос о «избыточном» использовании подстановочных знаков

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