Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.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 在GWT-RPC中使用嵌套枚举_Java_Gwt_Enums_Gwt Rpc - Fatal编程技术网

Java 在GWT-RPC中使用嵌套枚举

Java 在GWT-RPC中使用嵌套枚举,java,gwt,enums,gwt-rpc,Java,Gwt,Enums,Gwt Rpc,我有一个带有嵌套枚举的枚举(我想将其设置为私有),但当我这样做时,GWT告诉我嵌套枚举不可见,并引发异常 public enum OuterEnum { A(NestedEnum.X), B(NestedEnum.Y), C(NestedEnum.X); NestedEnum nestedValue; private OuterEnum(NestedEnum nv) { nestedValue = nv; } private enum Nest

我有一个带有嵌套枚举的枚举(我想将其设置为私有),但当我这样做时,GWT告诉我嵌套枚举不可见,并引发异常

public enum OuterEnum {
    A(NestedEnum.X),
    B(NestedEnum.Y),
    C(NestedEnum.X);

    NestedEnum nestedValue;
    private OuterEnum(NestedEnum nv) { nestedValue = nv; }

    private enum NestedEnum {
        X, Y;
    }
}

如果我从嵌套枚举中删除private修饰符,那么代码就可以工作。为什么GWT不允许嵌套枚举使用私有修饰符?有解决办法吗?

这可能与JavaScript有关。在转换为JavaScript的过程中,嵌套类可能被编写为非嵌套类。因此,如果它是私有的,其他任何东西都无法访问它。解决方法是不要将其设置为私有,默认作用域应该可以正常工作。

要成为RPC参数类类型,它必须有一个空构造函数用于序列化。 所以我想,如果你加上

private OuterEnum(){
// may be you should give a default value to nestedValue
}

它会成功的

序列化工作得很好,至少在您提供的示例中是这样。所有枚举都以以下方式进行序列化/反序列化(GWT 2.4、2.3、2.2):

这个例子与前一个非常不同。假设在GWT-RPC服务中使用了OuterClass。由于NestedEnum用作OuterClass的字段,GWT需要为其创建一个TypeSerializer。但是由于TypeSerializer是一个单独的类,所以它没有任何对NestedEnum的访问权(因为它是私有的)。所以编译失败了


这基本上是您的示例不起作用的唯一情况。在某些特定的GWT版本中可能会有一些bug,但我100%确信您的示例在GWT 2.2-2.4中有效。

您是否尝试过将其设置为静态?这真是太酷了!JLS(第8.9节)明确指出“嵌套的枚举类型是隐式静态的。允许显式地将嵌套的枚举类型声明为静态的。”这不适用于嵌套在
enum
s中的
enum
s,还是GWT编译器中的一个小缺陷?……而GWT编译器只是使用Eclipse编译器(ECJ)解析源代码并构建AST。因此,要么Eclipse编译器在不将枚举暴露为静态方面存在缺陷,要么GWT在不推断嵌套枚举的静态标志方面存在缺陷(我会选择ECJ,但这实际上取决于它们的意图;这可能是设计上的)……我觉得很愚蠢。。。。以前的版本中有一些东西挂在那里,结果是使它保持静态并没有什么区别。。。。回到绘图板上。对不起,伙计们!您使用的是什么GWT版本?在GWT2.4.0中,您的示例可以正常工作。这是一个很好的观点,我没有想到这一点。理想情况下,我希望它是私有的…问题是内部枚举的可见性。它可以很好地序列化外部枚举。这不能回答我的问题。
    public static OuterEnum instantiate(SerializationStreamReader streamReader) throws SerializationException {
            int ordinal = streamReader.readInt();
            OuterEnum[] values = OuterEnum.values();
            assert (ordinal >= 0 && ordinal < values.length);
            return values[ordinal];
}

    public static void serialize(SerializationStreamWriter streamWriter, OuterEnum instance) throws SerializationException {
            assert (instance != null);
            streamWriter.writeInt(instance.ordinal());
}
public class OuterClass implements Serializable{

    private OuterEnum.NestedEnum nested;
    private OuterEnum outer;

    public enum OuterEnum {
        A(NestedEnum.X), B(NestedEnum.Y), C(NestedEnum.X);

        NestedEnum nestedValue;

        private OuterEnum(NestedEnum nv) {
            nestedValue = nv;
        }


        private enum NestedEnum {
            X, Y;
        }
    }
}