Если Вы не используете Java Generics, я считаю, что невозможно иметь в одном классе два метода, которые различаются только по типу возврата.
Другими словами, это было бы незаконным :
public HappyEmotion foo(T emotion) {
// do something
}
public SadEmotion foo(T emotion) {
// do something else
}
То же самое верно при перегрузке методов, которые возвращают общий тип, который может реализовывать различные интерфейсы, например, если бы следующие два метода присутствовали в одном и том же определении класса:
public <T extends Happy> T foo(T emotion) {
// do something
}
public <T extends Sad> T foo(T emotion) {
// do something else
}
Это было бы незаконно?