Java int 和 Integer 行为更改所需的常量表达式

constant expression required in Java behaviour change for int and Integer

对于一些代码,愿意节省一些 Boxing/Unboxing 引入的麻烦,因为我还必须使用 int 常量作为整数(由泛型方法调用强制),我从这个简化的例子开始

enum SOQ {
    TYPEA,
    TYPEB,
    TYPEC;
    public static final int width = 10;

    public static SOQ of(int i) {
        switch (i) {
            case UIOrdinals.TYPEA_ORD:
                return TYPEA;
            case UIOrdinals.TYPEB_ORD:
                return TYPEB;
            case UIOrdinals.TYPEC_ORD:
                return TYPEC;
        }
        throw new UnsupportedOperationException("Not supported yet."); //TODO : implement
    }

    public static class UIOrdinals {

        public static final int TYPEA_ORD = width * 1;
        public static final int TYPEB_ORD = width * 2;
        public static final int TYPEC_ORD = width * 3;
    }
}

到这个

enum SOQBOX {
    TYPEA,
    TYPEB,
    TYPEC;
    public static final Integer width = 10;

    public static SOQBOX of(int i) {
        switch (i) {
            case UIBoxOrdinals.TYPEA_ORD:
                return TYPEA;
            case UIBoxOrdinals.TYPEB_ORD:
                return TYPEB;
            case UIBoxOrdinals.TYPEC_ORD:
                return TYPEC;
        }
        throw new UnsupportedOperationException("Not supported yet."); //TODO : implement
    }

    public static class UIBoxOrdinals {

        public static final Integer TYPEA_ORD = width * 1;
        public static final Integer TYPEB_ORD = width * 2;
        public static final Integer TYPEC_ORD = width * 3;
    }
}

没什么大不了的。

正如我所说,我这样做是因为一个辅助方法依赖 'width'。 这个方法(会经常被调用)需要一些泛型类型参数(不允许原始类型),所以需要引入 Integer.

在我看来很明显 TYPEnnn_ORD 仍然是常量,并且仍然是编译时常量 但这不是 java 编译器的观点: "constant expression required" 是错误。

只是想知道为什么在这个简单的案例中?它与拳击有关,但如何以及为什么?

与此同时,我又回到了原始的 int,希望像 Jdk 8 和 Jdk 9 这样的现代人 jdk 不会在 boxing/unboxing 上浪费那么多精力.

对了,作为子公司,你知道现在java在这一点上的竞争如何吗?这是我们仍应尽量减少的事情吗?

自动拆箱通过在后台调用适当的方法进行。 Integer.intValue() 你的情况。您不能在 case 语句中调用方法,它必须是要检查的原始值。