Identity Interface был внедрен в систему несколько лет назад.В этот момент мы получили необходимость, чтобы каждая идентичность была сопоставимой.Одним из вариантов является добавление дополнительного типа & Comparable к объявлению идентификации:
interface Identity<K> {
}
class Handler<T extends Identity<?> & Comparable<T>> {
Handler(T value) {
Util.<T>handle(value);
}
}
class Handler2<T extends Identity<?> & Comparable<T>> {
Handler2(T value) {
Util.<T>handle(value);
}
}
interface Util {
static <T extends Comparable<T>> void handle(T value) {
}
}
Одним из основных недостатков является то, что огромный объем кода должен быть дополнен идентичной информацией (например, & Comparable ).Очень элегантным решением было бы расширить Comparable интерфейс с Identity One:
interface Identity<K> extends Comparable<Identity<K>>{
}
Но в этом случае класс Handler выделит ошибку компиляции:
error: дескриптор метода в интерфейсе Util не может быть применен к данным типам;обязательно: T # 1 найдено: T # 2 причина: явный аргумент типа T # 2 не соответствует объявленным границам. Сопоставимо, где T # 1, T # 2 - переменные типа: T # 1 расширяет Comparable, объявленный в дескрипторе метода.(T # 1) T # 2 расширяет идентичность, объявленную в классе Handler
Каковы возможные решения в этой ситуации?