Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从集合转换<;SomeEnum>;设置<;?扩展SomeInterface>;当SomeEnum实现SomeInterface时_Java_Generics_Enums - Fatal编程技术网

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);