标题几乎解释了这个问题.我有一个接口方法:
Set<Field> getFieldSet()
Run Code Online (Sandbox Code Playgroud)
我有一个类,User看起来像这样
class User {
enum Fields implements Field {
USERNAME, PASSWORD;
...
}
...
}
Run Code Online (Sandbox Code Playgroud)
现在我想实现User的getFieldSet()方法.天真的方式似乎只是return EnumSet.allOf(Fields.class)但我得到以下错误:
> Type mismatch: cannot convert from Set<User.Fields> to Set<Field>
Run Code Online (Sandbox Code Playgroud)
除了手动复制EnumSet之外Set<Field>,还有一个很好的方法吗?
我有一个EnumSet并且想要来回转换为布尔基元数组.如果它工作得更好,我可以使用一个List而不是数组,和/或Boolean对象而不是布尔基元.
enum MyEnum { DOG, CAT, BIRD; }
EnumSet enumSet = EnumSet.of( MyEnum.DOG, MyEnum.CAT );
Run Code Online (Sandbox Code Playgroud)
我想在另一端获得的是一个如下所示的数组:
[TRUE, TRUE, FALSE]
Run Code Online (Sandbox Code Playgroud)
这里的这个问题与此类似,将EnumSet转换为整数数组.区别:
Boolean整数(显然)TRUE每个枚举元素包含在EnumSeta和a中FALSE,每个元素都被排除在外EnumSet.另一个问题的数组仅包括在中找到的项目EnumSet.(更重要的是)所以我有一堆枚举,它们都扩展了一个接口:
public interface MyInterface {}
Run Code Online (Sandbox Code Playgroud)
然后我有几个扩展界面的枚举:
public enum A implements MyInterface {}
public enum B implements MyInterface {}
Run Code Online (Sandbox Code Playgroud)
我想要一个只接受扩展此接口的枚举的函数.我不能做:
public void MyFunction(MyInterface input)
Run Code Online (Sandbox Code Playgroud)
因为,在函数内部,我使用EnumSet.of(输入)创建一个EnumSet.我做了
public <T extends Enum<T>> void myFunction(T input)
Run Code Online (Sandbox Code Playgroud)
因为,在函数内部,我需要创建一个需要传递给另一个函数的Map.那么有没有任何类型安全的方法来做这个没有铸造?
编辑:更正的接口定义.
我想做一个国家枚举,我可以从中访问其状态,我该怎么做?
像这样的东西:
public enum SomeEnum {
ARGENTINA {
BUENOS_AIRES;
}
UNITED_STATES {
CALIFORNIA, FLORIDA, NEW_YORK, ALASKA;
}
}
SomeEnum state1 = SomeEnum.ARGENTINA.BUENOS_AIRES
SomeEnum state2 = SomeEnum.UNITED_STATES.CALIFORNIA;
Run Code Online (Sandbox Code Playgroud) 有许多关于类似错误的类似问题,但它们都是关于在尝试创建该类型的 EnumSet 之前枚举类型尚未初始化的特定情况。我的问题非常非常基本。我无法让任何 EnumSet 方法将任何枚举识别为枚举,无论我尝试做的事情多么简单。例如:
> enum X{GREEN,RED,YELLOW}
> X.values()
{ GREEN, RED, YELLOW }
> EnumSet.allOf(X.class);
java.lang.ClassCastException: class X not an enum
at java.base/java.util.EnumSet.noneOf(EnumSet.java:113)
at java.base/java.util.EnumSet.allOf(EnumSet.java:132)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
Run Code Online (Sandbox Code Playgroud)
无论我尝试使用什么 EnumSet 方法,我都会得到完全相同的错误。有谁知道我可能做错了什么?我在 JDK 8 中使用 DrJava,因为这是我学到的东西,我只是为了好玩而这样做,所以我不需要使用最新的开发工具包,这可能是问题吗?文档说 EnumSet 是 Java 8 的一部分,所以我认为不是,但我不知道。
是否可以让java中的枚举将一组枚举作为参数?如果是,那我该如何实现呢?
使用这个时,我想说的是:拿一个MODAL_SETTINGS.EDIT_MODAL_WINDOW并使用按钮MODAL_BUTTONS.SAVE和MODAL_BUTTONS.CANCEL创建它.
这就是我现在所拥有的
public enum MODAL_SETTINGS {
NEW_MODAL_WINDOW(MODAL_BUTTONS.class),
EDIT_MODAL_WINDOW(MODAL_BUTTONS.class),
DELETE_MODAL_WINDOW(MODAL_BUTTONS.class);
private EnumSet buttons;
private MODAL_SETTINGS(EnumSet<MODAL_BUTTONS> buttons){
}
}
public enum MODAL_BUTTONS {
SAVE, UPDATE, CANCEL, DELETE
}
Run Code Online (Sandbox Code Playgroud) 我使用以下代码初始化EnumSet的同步实例:
private final Set<MyClass> instance = Collections.synchronizedSet(EnumSet.noneOf(MyClass.class));
Run Code Online (Sandbox Code Playgroud)
我有两个问题:
我试图扩展EnumSet到Comparable在Eclipse中实现.但是,从一开始我就充满了错误.这是我开始的:
package sets;
import java.util.EnumSet;
enum Suits{
SPADE, DIAMOND, CLUB, HEART;
}
class ExtendedEnumSet extends EnumSet<Suits> implements Comparable<Suits> {
}
Run Code Online (Sandbox Code Playgroud)
它立即通知我:Implicit super constructor EnumSet<Suits>() is undefined for default constructor. Must define an explicit constructor.所以,我按照快速修复,它添加了以下构造函数:
ExtendedEnumSet(Class<Suits> finalArg0, Enum[] finalArg1) {
super(finalArg0, finalArg1);
// TODO Auto-generated constructor stub
}
Run Code Online (Sandbox Code Playgroud)
......然后它通知我:The constructor EnumSet<Suits>(Class<E>, Enum[]) is not visible.我已经尝试更改此类和此构造函数的访问修饰符无济于事.
下一个问题是当我决定继续并修复Eclipse报告的下一个错误时:The type ExtendedEnumSet must implement the inherited abstract method AbstractCollection<Suits>.iterator().当然,这只是冰山一角.我再次使用快速修复(add unimplemented methods)并添加以下内容: …
我看到EnumSet.of()返回EnumSet类型的对象的实例.但我无法弄清楚哪个类实际实现了这个抽象类?当你没有子类化它时,如何获得抽象类型EnumSet的实例?
假设我们有枚举
enum class Status {
OPEN, CLOSED
}
enum class Weekday {
WORKDAY, DAYOFF
}
Run Code Online (Sandbox Code Playgroud)
有一个 Java 类
public KotlinInvoker {
public methodWithKotlinEnumAsParameter_namely_AppendWorkingStatusString( ? kotlinEnum) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
目标是直接将任何 jave / kotlin 枚举传递给那种函数,就像 Java 一样
<E extends java.lang.Enum<E>>
methodAcceptingEnumAsParameter(E enum) {
...
return result + ' ' + enum.toString();
}
Run Code Online (Sandbox Code Playgroud)
所以你可以将任何枚举传递给它。应该是什么方法签名才能很好地与 kotlin 枚举一起使用,并且根据官方 kotlin 文档将其映射到 java 枚举?