В некоторых 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
?
Если я могу немного читать строки, я думаю, что вы спрашиваете, как вы делаете эту часть в частности родительский:
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);
int[]
, почему вы хотите универсальную переменную?auto
в C ++ илиvar
в C #, и нет хорошего способа сохранить это правило, кроме вызоваcompare
в одной строке (кроме Reflection)