Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.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中分配枚举值_Java_Enums - Fatal编程技术网

在Java中分配枚举值

在Java中分配枚举值,java,enums,Java,Enums,如果我有两个枚举,请说: public enum E1 { A, B } public enum E2 { A, B } 是否有任何方法可以将枚举类型E2的值分配给类型E1的值,如下所示: E2 var = E1.B; (假设我事先知道两个枚举中都存在B) 编辑: 我知道Java不允许这样做。也许我也应该解释一下。我有一个类型为enum E1的变量(x)(可以是a或B)。对于我试图完成的任务,我需要另一个类型为enum E2且值相同的变量。我现在处理这个问题的方式基本上是:

如果我有两个枚举,请说:

public enum E1 {
    A, B
}

public enum E2 {
    A, B
}
是否有任何方法可以将枚举类型E2的值分配给类型E1的值,如下所示:

E2 var = E1.B;
(假设我事先知道两个枚举中都存在B)

编辑:

我知道Java不允许这样做。也许我也应该解释一下。我有一个类型为enum E1的变量(x)(可以是a或B)。对于我试图完成的任务,我需要另一个类型为enum E2且值相同的变量。我现在处理这个问题的方式基本上是:

if (x == E1.A) {
    E2 var = E2.A;
} else {
    E2 var = E2.B;
}

因此,我想我要问的是,有没有更好的方法可以做到这一点?

如果让两个enum实现相同的接口,您可以间接做到这一点:

interface CommonEnumInterface{}

public enum E1 implements  CommonEnumInterface{
A, B
} 

public enum E2 implements  CommonEnumInterface{
C, D
}

CommonEnumInterface myE  = E1.A;
myE  = E2.D;

如果让两个枚举实现相同的接口,则可以间接执行此操作:

interface CommonEnumInterface{}

public enum E1 implements  CommonEnumInterface{
A, B
} 

public enum E2 implements  CommonEnumInterface{
C, D
}

CommonEnumInterface myE  = E1.A;
myE  = E2.D;

是的,如上所述,答案是你不能这样做


Java中的枚举是类型安全的,并且有自己的命名空间。这意味着您的枚举将有一个类型,例如“Currency”,并且除了在枚举常量中指定的值之外,您不能分配任何值。E1是E1,E2是E2名称空间。

是的,正如上面所评论的,答案是你不能这样做

Java中的枚举是类型安全的,并且有自己的命名空间。这意味着您的枚举将有一个类型,例如“Currency”,并且除了在枚举常量中指定的值之外,您不能分配任何值。E1是E1,E2是E2命名空间。

否。

E1
E2
是两种不同的枚举类型。假设您正在开发一个纸牌游戏应用程序,您有一个用于Suite的枚举和一个用于Rank的枚举。你所问的相当于试图说一张卡片可以有一组
Rank.TEN
或一组
Suite.HEARTS
。这毫无意义,也不是枚举的工作方式。

否。


E1
E2
是两种不同的枚举类型。假设您正在开发一个纸牌游戏应用程序,您有一个用于Suite的枚举和一个用于Rank的枚举。你所问的相当于试图说一张卡片可以有一组
Rank.TEN
或一组
Suite.HEARTS
。它毫无意义,也不是枚举的工作方式。

好吧,看看你的第二个代码片段,你能做的就是将
E2
定义为

enum E2 {
    A, B
}
E1
as

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
)、构造函数(
E1(E2 es){…}
)和方法(
public E2 getE2()
)。这样,您就可以将任何其他值“添加”到枚举实例中,并在以后使用getter查询它们。

看看您的第二个代码片段,您可以将
E2
定义为

enum E2 {
    A, B
}
E1
as

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
)、构造函数(
E1(E2 es){…}
)和方法(
public E2 getE2()
)。这样,您就可以将任何其他值“添加”到枚举实例中,并在以后使用getter查询它们。

简单的回答是否,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)


简单的回答是不,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)


由于您可以将
enum
定义为符合具有自己属性和方法的接口的“轻量级类”,因此您可以编写如下组合规则:

E2 var = E1.B;
内饰.java

import java.util.List;

public interface Upholstery {

    public List<Material> combinesWith();

}
import java.util.List;
公共界面装潢{
公共列表与()组合;
}
Material.java

import java.util.List;

public interface Material {

    public List<Upholstery> combinesWith();
}
import java.util.List;
公共界面材料{
公共列表与()组合;
}
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);
        }
    }
}
导入java.util.array;
导入java.util.List;
公共枚举室内装潢实现室内装潢{
绸缎{
@凌驾
公共列表combinesWith(){
返回阵列。asList(材料。塑料);
}
},
皮革{
@凌驾
公共列表combinesWith(){
返回数组.asList(材料.桃花心木);
}
}
}
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);
        }
    }
}
导入java.util.array;
导入java.util.List;
公共枚举材质实现材质{
桃花心木{
@凌驾
公共列表combinesWith(){
返回阵列。asList(室内装潢),
室内装潢(皮革);
}
},
塑料制品{
@凌驾
公共列表combinesWith(){
返回阵列.asList(室内装潢.缎面);
}
}
}

显然,您可以向接口添加其他方法,或者修改
combinesWith()
的签名以实现更复杂的逻辑-例如
combinesWith(家具类型f,双预算)

,因为您可以将
enum
定义为符合具有自己属性和方法的接口的“轻量级类”