Я ожидал бы, что хороший компилятор сможет обнаружить ошибку, но в качестве оптимизации.Вы представляете конкретный случай более общего случая, подобного этому:
public class TestCase {
public static TypeA methodA() {
return methodB();
}
public static <T extends TypeB> T methodB() {
return (T) null;
}
}
Теперь, в общем, в этом нет ничего плохого, при условии:
- Если оба типа TypeA и TypeB оба являются классамитогда TypeB является суперклассом TypeA.
- TypeA или одного из подтипов TypeA наследуется от TypeB.
Теперь главное, что компилятор не является't проверка # 2, когда это возможно в этом случае.Но это только , потому что String
- последний класс.Если класс не окончательный, # 2 всегда будет истинным, потому что потенциальные подклассы не известны во время компиляции.
Представьте, что вместо String
вы использовали CharSequence
.Тогда я ожидал бы, что все три будут компилироваться.Однако я не могу объяснить, почему в вашем примере второй и третий методы не компилируются.
Edit
А теперь я попробовал это с javac
и обнаружил, что первый метод делаетне компилировать тоже.Вышеизложенное принимает предпосылку вашего вопроса, которая кажется ложной.Я получаю вводящую в заблуждение ошибку компиляции
Несовместимые типы.Требуется: java.lang.String
.Найдено: T
.
Этот ответ не отвечает на полный вопрос, а скорее объясняет, почему он не работает, а что-то вроде этого:
public static CharSequence compiles() {
return (CharSequence)getAction();
}
делает.