Я читаю раздел «Дженерики и коллекции Java» 8.4. Автор определяет следующий код при попытке объяснить бинарную совместимость:Невозможно воспроизвести результат примера стирания типа
interface Name extends Comparable {
public int compareTo(Object o);
}
class SimpleName implements Name {
private String base;
public SimpleName(String base) {
this.base = base;
}
public int compareTo(Object o) {
return base.compareTo(((SimpleName)o).base);
}
}
class ExtendedName extends SimpleName {
private String ext;
public ExtendedName(String base, String ext) {
super(base); this.ext = ext;
}
public int compareTo(Object o) {
int c = super.compareTo(o);
if (c == 0 && o instanceof ExtendedName)
return ext.compareTo(((ExtendedName)o).ext);
else
return c;
}
}
class Client {
public static void main(String[] args) {
Name m = new ExtendedName("a","b");
Name n = new ExtendedName("a","c");
assert m.compareTo(n) < 0;
}
}
и затем переговоры о создании интерфейса Имени и SimpleName класса родового и оставляя ExtendedName как есть. В результате новый код:
interface Name extends Comparable<Name> {
public int compareTo(Name o);
}
class SimpleName implements Name {
private String base;
public SimpleName(String base) {
this.base = base;
}
public int compareTo(Name o) {
return base.compareTo(((SimpleName)o).base);
}
}
// use legacy class file for ExtendedName
class Test {
public static void main(String[] args) {
Name m = new ExtendedName("a","b");
Name n = new ExtendedName("a","c");
assert m.compareTo(n) == 0; // answer is now different!
}
}
Автор описывает результат такого действия следующим образом:
Сказать, что мы generify имя и SimpleName так, что они определяют CompareTo (имя), но у нас нет источника для ExtendedName. Поскольку он определяет только compareTo (Object), клиентский код, который вызывает compareTo (Name), а не compareTo (Object), вызывается методом SimpleName (где он определен), а не ExtendedName (где он не определен), поэтому базовые имена будут сравниваться, но расширения игнорируются.
Однако, когда я делаю только имя и SimpleName generic, я получаю ошибку времени компиляции, а не то, что автор описывает выше. Ошибка:
конфликта имен: CompareTo (объект) в NameHalfMovedToGenerics.ExtendedName и CompareTo (Т) в сравнимых имеют тот же стирание, но ни один не перекрывает другой
И это не первый я столкнулся с такой проблемой. Раньше, пытаясь прочитать документацию Sun о стирании, я столкнулся с аналогичной проблемой, когда мой код не показывает тот же результат, что и автор.
Я допустил ошибку в понимании того, что автор пытается сказать?
Любая помощь будет очень признательна.
Заранее благодарен.
Отправьте код, в котором вы «* укажите только имя и простое имя» *. –
У меня уже есть - во втором кодовом блоке выше. Вы просите что-то еще? 1. Сопоставимый преобразуется в Сопоставимый и 2.В классе SimpleName метод compareTo (Object) становится compareTo (Name). –
Mustafa
Вы сделали источник для 'ExtendedName' недоступным, как предполагал автор? –