Каковы возможности для разработки API, который нуждается в перегрузках в зависимости от универсального типа? - PullRequest
2 голосов
/ 12 мая 2019

В данном классе Example<A> Мне нужны следующие две функции:

void doSomething(Supplier<A>)

<B> void doSomething(Supplier<B>)

Каковы возможности для достиженияэтот?Мне известны следующие подходы:

  1. дают функциям разные имена
  2. использовать тип-обертку для второго определения WrapperType.of(Supplier<B>)
  3. использовать функцию, которая преобразуетExample<A> до Example<B>

Существуют ли другие подходы?

Мне не нравится 1), поскольку он загромождает мой API.2) действительно многословен, так как мне приходится часто вызывать упомянутую функцию, и статический импорт очень необычен вне тестирования кода.3) очень четко говорит о внутренней проблеме, о которой я не хочу, чтобы пользователь заботился о

1 Ответ

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

Я нашел другой способ, указав расширение Function<A,B> следующим образом:

class SpecificFunction<A,B> extends Function<A,B> {}

Можно определить множественные перегрузки для Function<A,B> и SpecificFunction<A,C>, что было бы невозможно без дополнительного классаиз-за стирания типа.Это работает, потому что спецификация языка java явно обязывает компилятор java связывать вызов функции с самой конкретной функцией, которую он может найти.Одна часть в определении того, как найти наиболее конкретную функцию, заключается в следующем: если две функции m(a) и n(b) существуют, m(a) более конкретна, чем n(b), если b не является подтипом a, что верно для нашего SpecificFunction<A,B>.

...