如果我有两个枚举,请说:
public enum E1 {
A, B
}
public enum E2 {
A, B
}
有没有办法可以将枚举类型E2的值赋给E1类型的值,如下所示:
E2 var = E1.B;
(假设我事先知道B存在于两个枚举中)
修改
我知道Java并不允许这样做。也许我应该解释一下。我有一个枚举E1 的变量(x)(它可以是A或B)。对于我想要实现的任务,我需要使用相同值的另一个枚举E2 变量。我现在处理这个问题的方式基本上是:
if (x == E1.A) {
E2 var = E2.A;
} else {
E2 var = E2.B;
}
所以我想我问的是,有没有更好的方法呢?
答案 0 :(得分:3)
否强>
E1
和E2
是两种不同的枚举类型。想象一下,你正在开发一个纸牌游戏应用程序,你有一个套件的枚举和Rank的枚举。您提出的要求相当于试图说明一张卡片的Rank.TEN
套件或等级Suite.HEARTS
。它只是没有意义,而不是枚举的工作方式。
答案 1 :(得分:2)
如果让两个枚举实现相同的接口,则可以间接执行此操作:
interface CommonEnumInterface{}
public enum E1 implements CommonEnumInterface{
A, B
}
public enum E2 implements CommonEnumInterface{
C, D
}
CommonEnumInterface myE = E1.A;
myE = E2.D;
答案 2 :(得分:0)
上面评论的答案是,你不能这样做。
Java中的枚举是类型安全的,并且有自己的命名空间。这意味着你的枚举将有一个类型,例如"货币"并且您不能分配除枚举常量中指定的值以外的任何值。 E1为E1,E2为E2命名空间。
答案 3 :(得分:0)
好好看看你的第二个片段,你可以做的是将E2
定义为
enum E2 {
A, B
}
和E1
为
enum E1 {
A(E2.A), B(E2.B);
private E2 e2;
E1(E2 e2) {
this.e2 = e2;
}
public E2 getE2() {
return e2;
}
}
像这样,您只需将if
声明写为即可
E2 var = x.getE2();
这个解决方案背后的想法是,与Java中的任何其他类一样,枚举可以具有属性(private E2 e2
),构造函数(E1(E2 es) {...}
)和方法(public E2 getE2()
)。就像那样你可以"添加"枚举实例的任何其他值,并使用getter稍后查询它们。
答案 4 :(得分:0)
简短的回答是NO,java不允许
我需要更多关于你究竟需要做什么的信息,但你可以做类似的事情
public static void main(String[] args) {
E2 myE2 = E2.valueOf(E1.A.name());
System.out.println(myE2);
}
enum E1 {
A, B
}
enum E2 {
A, B
}
并注意这只会起作用,因为字段A在两个枚举中定义,否则无法使用java.lang.IllegalArgumentException: No enum constant ...
但是这种解决方法正是您在说
时发布的内容(假设我事先知道B存在于两个枚举中)
答案 5 :(得分:0)
由于您可以将enums
定义为'轻量级类'使用自己的属性和方法符合接口,您可以编写如下的组合规则:
Upholstery.java
import java.util.List;
public interface Upholstery {
public List<Material> combinesWith();
}
Material.java
import java.util.List;
public interface Material {
public List<Upholstery> combinesWith();
}
Upholsteries.java
import java.util.Arrays;
import java.util.List;
public enum Upholsteries implements Upholstery {
SATIN {
@Override
public List<Material> combinesWith() {
return Arrays.asList(Materials.PLASTIC);
}
},
LEATHER {
@Override
public List<Material> combinesWith() {
return Arrays.asList(Materials.MAHOGANY);
}
}
}
Materials.java
import java.util.Arrays;
import java.util.List;
public enum Materials implements Material {
MAHOGANY {
@Override
public List<Upholstery> combinesWith() {
return Arrays.asList(Upholsteries.SATIN,
Upholsteries.LEATHER);
}
},
PLASTIC {
@Override
public List<Upholstery> combinesWith() {
return Arrays.asList(Upholsteries.SATIN);
}
}
}
显然,您可以向接口添加其他方法,或修改combinesWith()
的签名以实现更复杂的逻辑 - 例如combinesWith(FurnitureType f, double budget)
。