Как создать общий класс, который относится к вложенным родовым типам?
Я пытаюсь создать класс Comparator, который может сравнивать внутренние типы B, не желая раскрывать то, что эти типы. В следующем примере я получаю предупреждение о компиляторе для того, чтобы сырые лить мои внутренние вложенные значения T в Comparable:
public class SSCCE {
// Compare my A instances.
class AComparator<T extends B> implements Comparator<T> {
@Override
public int compare(final T o1, final T o2) {
return o1.getValue().compareTo(o2.getValue());
}
}
class A extends B<Integer> {
@Override Integer getValue() { return 1; }
}
class A2 extends B<String> {
@Override String getValue() { return "Test String!"; }
}
abstract class B<T extends Comparable<T>> {
abstract T getValue();
}
public static void main(String[] args) {
SSCCE sscce = new SSCCE();
AComparator<A> comparator = sscce.new AComparator<>();
comparator.compare(sscce.new A(), sscce.new A());
}
}
Можно ли представить внутренние значения, чтобы безопасно разрешить кастинг?
Вещи, которые я пробовал:
-
Создание сопоставимого шаблона (несовместимого):
class AComparator2<T extends B<? extends Comparable<?>>> implements Comparator<T> { @Override public int compare(final T o1, final T o2) { Comparable<?> o1value = (Comparable) o1.getValue(); Comparable<?> o2value = (Comparable) o2.getValue(); return o1value.compareTo(o2value); } }
-
Объявление вторичного типового типа параметров (U), которое просто откладывает проблему:
class AComparator3<T extends B<U>, U extends Comparable<U>> implements Comparator<T> { @Override public int compare(final T o1, final T o2) { U o1value = o1.getValue(); U o2value = o2.getValue(); return o1value.compareTo(o2value); } } ... AComparator3<A, Comparable<U>> comparator = sscce.new AComparator3();
Этот компаратор не должен сравнивать два экземпляра классов A, а часть их содержимого.