Могу ли я расширить этот класс и переопределить тип перечисления или добавить дополнительные константы к этому перечислению?
Проблема в вашей ситуации называется сокрытием , а не переопределяет перечисления, а два перечисленных выше не связаны друг с другом.Если вы указали переопределение как , расширяющее тип перечисления, поскольку перечисление уже объявлено с ключевым словом final, вы не можете создать подтип типа перечисления, чтобы добавить больше констант.
Цель состоит в том, чтобы пользователь мог вызывать метод getColor (), не зная, принадлежит ли динамический объект базовому классу или производному классу
Вы неверны впереопределение метода getColor.Тем не менее, вы сделали этот метод в подклассе RacingCar имеет ту же сигнатуру, что и метод в суперклассе Car.Вы все еще забыли о типе возврата , который должен совпадать с типом возврата в суперклассе или быть подтипом типа возвращаемого значения переопределенного метода.У нас есть два разных перечисления, которые имеют одно имя CarColors.Другими словами, полное имя перечисления в подклассе - RacingCar.CarColors, а в суперклассе - Car.CarColors.Итак, вы нарушили правило переопределения методов, а не того же типа возвращаемого значения и не подтипа возвращаемого типа суперкласса.
В этом случае мы не можем создать подтип, и вы не хотите вставлятьЖЕЛТЫЙ для перечисления CarColors в суперклассе Car, вот мое решение.
interface IColor{
}
enum CarColors implements IColor{
BLUE,
GREEN;
}
enum RacingCarColors implements IColor{
BLUE,
GREEN,
YELLOW;
}
class Car {
protected IColor color;
public Car(IColor color){
this.color = color;
}
public IColor getColor(){
return color;
}
}
class RacingCar extends Car{
public RacingCar(IColor color){
super(color);
}
public IColor getColor(){
return color;
}
}
public class Test{
public static void main(String[] args) {
Car car = new RacingCar(RacingCarColors.YELLOW);
System.out.println(car.getColor());
}
}
Подход все еще переопределяет метод getColor, но я использовал один и тот же тип возврата IColor, что интерфейс является супертипом двух перечислений втвой пример.Это решение полностью соответствует вашим ожиданиям, но может оказаться сложным.