Захват универсального типа из реализации

1

В некоторых Java-коде у меня есть такой интерфейс:

interface A<T> {
    T produce();
    compare(T x, T y);
}

У меня разные реализации, такие как:

class B extends A<int[]> {
    int[] produce() {...}
    compare(int[] x, int[] y) {...}
}

Проблема заключается в том, как захватить специфический для реализации тип общего типа. Не работает следующее:

A<T> a = new B();
T x = a.produce();
T y = a.produce();
a.compare(x, y);

Разумеется, тип T не относится к тому, что внутри B (На самом деле это ни на что не ссылается).

Есть ли способ заставить T захватить общий тип B?

  • 3
    Вы уже знаете, что это int[] , почему вы хотите универсальную переменную?
  • 0
    К сожалению, в Java отсутствует идентификатор, позволяющий компилятору выводить тип, например, auto в C ++ или var в C #, и нет хорошего способа сохранить это правило, кроме вызова compare в одной строке (кроме Reflection)
Показать ещё 3 комментария
Теги:
generics
wildcard

1 ответ

2
Лучший ответ

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

T x = a.produce();
T y = a.produce();
a.compare(x, y);

Ответ обычно заключается в том, чтобы "привязать" параметр типа с помощью общего метода:

private static <T> void produceAndCompare(A<T> a) {
    T x = a.produce();
    T y = a.produce();
    a.compare(x, y);
}

Затем вы можете вызвать его так:

produceAndCompare(new B());

И если он должен быть в переменной сначала:

A<?> a = getSomeA(); //could just return new B();
produceAndCompare(a);
  • 0
    Ах, значит, вы «пользуетесь» способностью связывать дженерики. Интересно.
  • 0
    @ThomasAhle: Точно. Я дал более подробное объяснение в этом ответе: stackoverflow.com/questions/16449799/… . Кроме того, этот учебник по Java достаточно хорошо вписывается в эту тему: docs.oracle.com/javase/tutorial/java/generics/capture.html
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню