Java 从集合转换<;SomeEnum>;设置<;?扩展SomeInterface>;当SomeEnum实现SomeInterface时
我有一个接口和一个枚举,如下所示:Java 从集合转换<;SomeEnum>;设置<;?扩展SomeInterface>;当SomeEnum实现SomeInterface时,java,generics,enums,Java,Generics,Enums,我有一个接口和一个枚举,如下所示: public interface SomeInterface { ...... } public enum SomeEnum implements SomeInterface { ...... } public class SomeClass { public void someMethod(Set<SomeInterface> s) { ... } } 公共接口SomeInterface{ .
public interface SomeInterface {
......
}
public enum SomeEnum implements SomeInterface {
......
}
public class SomeClass {
public void someMethod(Set<SomeInterface> s) {
...
}
}
公共接口SomeInterface{
......
}
公共枚举SomeEnum实现SomeInterface{
......
}
公共类{
公共方法(集合s){
...
}
}
现在调用someMethod(Set s)
我创建了一个包含所有元素的枚举集,因此我执行以下操作:
Set<? extends SomeInterface> choosen = EnumSet.allOf(SomeEnum.class);
SomeClass obj = new SomeClass();
obj.someMethod(choosen)
Set将您的集合转换为Set
,然后转换为所需的Set
。这应该可以解决您的问题…实现我想要的另一种方法是:
Set<SomeInterface> choosen = new HashSet<SomeInterface>(EnumSet.allOf(SomeEnum.class));
someMethod(choosen);
Set choosen=newhashset(EnumSet.allOf(SomeEnum.class));
someMethod(choosen);
与McDowell在copyUp()
方法中遇到的类似。强制转换和忽略警告显然不是类型安全的。(在这种情况下可能是安全的,但无论如何我都不推荐)
但最合适的解决方案还取决于someMethod
将如何处理集合。如果仅将从给定集合读取,则您可以在集合上传递不可修改的视图:
Set<? extends SomeInterface> set = ...
Set<SomeInterface> viewOnSet = Collections.unmodifiableSet(set);
someMethod(viewOnSet);
你试过石膏吗?您应该能够使用@SuppressWarnings将一个集合强制转换为另一个集合,以保持编译器安静。如果不行,你应该可以先投到一组,然后再投。投到Set
然后再投到Set
效果很好,谢谢@thethom。但是@SuppressWarnings
不起作用。我将作为答案发布。铸造应该是最后的手段,很少有必要。如果认为有必要,应注意它会破坏类型安全性。
Set<? extends SomeInterface> set = ...
Set<SomeInterface> viewOnSet = Collections.unmodifiableSet(set);
someMethod(viewOnSet);
Set<? extends SomeInterface> set = ...
Set<SomeInterface> newSet = new LinkedHashSet<SomeInterface>(set);
someMethod(newSet);