Java 无法将fom枚举转换为它实现的接口
我在Java 无法将fom枚举转换为它实现的接口,java,enums,Java,Enums,我在Java7中,我有以下枚举: public enum BooleanEnum implements StringRepresentable{ YES { @Override public String getStringRepresentation() { return "true"; } }, NO { @Override public String getStr
Java7
中,我有以下枚举:
public enum BooleanEnum implements StringRepresentable{
YES {
@Override
public String getStringRepresentation() {
return "true";
}
},
NO {
@Override
public String getStringRepresentation() {
return "false";
}
};
public abstract String getStringRepresentation();
}
现在我有了方法:
List<StringRepresentable> getValues(){
return Arrays.asList(BooleanEnum.values()); //Type mismatch:
//cannot convert from List<BooleanEnum> to List<StringRepresentable>
}
List getValues(){
返回Arrays.asList(booleaneum.values());//类型不匹配:
//无法从列表转换为列表
}
那个枚举有什么问题吗?它实现了接口,因此代码应该编译得很好。如果进行了编译,则有人可以执行以下操作:
List<StringRepresentation> values = getValues();
values.set(0, new SomeOtherStringRepresentation());
首先
booleaneum.values()
返回一个booleaneum[]
,然后使用Arrays.asList
返回一个List
由于列表
不是列表
的子集,因此不会编译此代码
理论上,您可以通过返回
列表来编译此代码您的列表的类型是StringRepresentation
,而booleaneum
仅实现StringRepresentable
,接口
不能转换为实现接口
的任何类型的类
它实现了接口,因此代码应该编译得很好
否,因为类型参数被推断为booleaneum
-并且列表
不是列表
。。。您可以将其他StringRepresentation
实现的实例添加到后者
四种可能的选择:
- 指定返回的是
StringRepresentation
的某个子类的列表:
List<? extends StringRepresentation> get Values() {
// Implementation as before
}
- 根本不返回
列表
;返回一个Iterable
,此时可以使用EnumSet
:
Iterable<? extends StringRepresentable> getValues() {
return EnumSet.allOf(BooleanEnum.class);
}
Iterable您应该返回如下内容:
return Arrays.<StringRepresentable>asList(BooleanEnum.values());
返回Arrays.asList(booleaneum.values());
由于BooleanEnum的列表与StringRepresentable的列表不同。试试List该列表不应该是List
而不是List
?@Loki,它只是一个打字错误。
StringRepresentation[] array = BooleanEnum.values();
return Arrays.asList(array);
Iterable<? extends StringRepresentable> getValues() {
return EnumSet.allOf(BooleanEnum.class);
}
return Arrays.<StringRepresentable>asList(BooleanEnum.values());