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 语句中调用方法,它必须是要检查的原始值。
对于一些代码,愿意节省一些 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 语句中调用方法,它必须是要检查的原始值。