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 的任何实现并抛出运行时异常?
问题在于,您正在使各个方法通用,而您需要使类型通用。所以,你需要使用:
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)