Rud*_*koŭ 7 java inheritance enums
我有一个IDevice接口和这个接口的两个枚举实现:AndroidDevice和IosDevice.问题是:我想values()在接口引用上使用潜在的输入和调用方法:
private IDevice getDeviceByReadableName(String versionInXml, IDevice devices) {
for(IDevice device : devices.values()){
//...
Run Code Online (Sandbox Code Playgroud)
所以我必须添加public IDevice[] values();到我的界面:
public interface IDevice {
//...
public IDevice[] values();
}
Run Code Online (Sandbox Code Playgroud)
但它不起作用.Eclipse问我remove static modifiers from AndroidDevice(...)
请:
小智 7
它不起作用的原因是因为values()为每个枚举隐式定义了静态方法.
public enum IOS {
//Compiler raises an error that values() method is already defined.
public IOS[] values(){
}
}
Run Code Online (Sandbox Code Playgroud)
因此,如果已经定义了静态方法,则无法添加具有相同签名的新实例级方法.
解决它的最简单方法是使用不同的方法名称.
public interface IDevice {
IDevice[] allvalues();
}
public enum IOS implements IDevice{
IPHONE, IPAD;
@Override
public IDevice[] allvalues() {
//return array of iOS devices;
}
}
Run Code Online (Sandbox Code Playgroud)
使用类型交集:
private <T extends Enum<T> & IDevice> T getDeviceByReadableName(String versionInXml, Class<T> deviceClass) {
for (T device : deviceClass.getEnumConstants()) {
if (<some-condition>)
return device;
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
绑定 toEnum<T>确保deviceClass.getEnumConstants()将返回值,绑定 to& IDevice确保您会得到IDevice返回值。
称呼它为:
enum IosDevice implements IDevice {
iPhone, iPad, MacBook;
}
IDevice d = getDeviceByReadableName("<foo/>", IosDevice.class);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
274 次 |
| 最近记录: |