Подтвердить что ты не робот

Ошибка Java generics?

Пусть имеет следующую иерархию классов:

public class MyType {
}

public class MySuperclass<T extends MyType> {
    protected Map<String, String> myMap = new TreeMap<String, String>();
    protected String myMethod(String s) {
        return myMap.get(s);
    }
}

public class MySubclass extends MySuperclass {
    @Override
    protected String myMethod(String s) {
        return myMap.get(s); // <-- compilation error
    }
}

Почему возникает ошибка компиляции в методе переопределения MySubclass? Сообщение об ошибке "Тип несоответствие: невозможно преобразовать из объекта в строку".

Интересно, что ошибка компиляции исчезает, если я определяю тип класса generics для определения MySuperclass в MySubclass:

public class MySubclass extends MySuperclass<MyType> {
    @Override
    protected String myMethod(String s) {
        return myMap.get(s);
    }
}

Может ли кто-нибудь объяснить это поведение? Я считаю, что это ошибка компилятора Java.

Я использую jdk1.6.0_24.

4b9b3361

Ответ 1

Это не ошибка. Расширяя MySuperclass вместо MySuperclass<MyType>, вы расширяете исходный тип MySuperclass, что означает, что myMap также будет иметь тип Map вместо Map<String, String>.

Ответ 2

Это действительно необоснованно. Это можно считать ошибкой в ​​дизайне. Основной причиной является решение сохранить отказоустойчивую коллективную API-интерфейс, вместо того, чтобы сохранить прежний и внедрить новый расширенный API. Это решение технически бессмысленно, и их объяснения смехотворны. Реальная причина этого - вероятно, Sun вынужден был вытеснить Java5, но не имел достаточного ресурса, поэтому они взяли легкий маршрут (стирание). Итак, мы здесь, полностью ввернуты. Эта система типа "ублюдок" не только сама по себе является проблемой, но и является большим препятствием для введения любой новой функции.

Ответ 3

если Foo - подтип (подкласс или подинтерфейс) Bar, а G - некоторый generic type, это не тот случай, когда G является подтипом G.

Вы можете обратиться http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf (для получения дополнительной информации)