如何在 Java 中的重写方法参数中强制执行 (Enum) 接口实现?

Voe*_*ter 1 java generics parameters enums

我在强制执行 (Enum) 接口实现作为 Java 中的重写方法参数时遇到问题。显示我正在尝试执行的操作的相关(简化)代码:

public interface AnimalSound {}
Run Code Online (Sandbox Code Playgroud)
public enum CowSound implements AnimalSound {
    MOO, BOO
}
Run Code Online (Sandbox Code Playgroud)
public interface Animal {
    <T extends AnimalSound> T getSound();
    <T extends AnimalSound> void setSound(T sound);
}
Run Code Online (Sandbox Code Playgroud)
public class Cow implements Animal {
    @Override
    public CowSound getSound() {
        return CowSound.BOO;
    }

    @Override
    public <T extends AnimalSound> void setSound(T sound) {
        if(sound.getClass() != CowSound.class) throw new IllegalArgumentException("Only works with cow sounds!");
    }
}
Run Code Online (Sandbox Code Playgroud)

#getSound 工作得很好(当我抑制 IDE Unchecked 覆盖警告时)。然而,#setSound 在这里并不强制执行 CowSound,我宁愿 IDE/编译器强制执行此操作,而不是在运行时抛出异常。

我想要使​​用 #setSound 方法执行的操作如下:

@Override
public void setSound(CowSound sound) {//set a sound}
Run Code Online (Sandbox Code Playgroud)

但是,这不会覆盖该接口。有没有更好/其他的方法来强制执行 CowSound 实现,而不是接受AnimalSound 的任何实现并抛出运行时异常?

Mar*_*eel 6

问题在于,您正在使各个方法通用,而您需要使类型通用。所以,你需要使用:

public interface Animal<T extends AnimalSound> {
    T getSound();
    void setSound(T sound);
}
Run Code Online (Sandbox Code Playgroud)

public class Cow implements Animal<CowSound> {
    @Override
    public CowSound getSound() {
        return CowSound.BOO;
    }

    @Override
    public void setSound(CowSound sound) {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)