Java 8-将Integer转换为长编译问题
问题内容:
我的项目中有以下抽象的通用数据持有人(简化):
public abstract static class Value<E> {
E value;
public void setValue(E value) {
this.value = value;
}
public E getValue() {
return this.value;
}
public String toString() {
return "[" + value + "]";
}
}
与一起,InputCollection
其中包含Objects
:
public static class InputCollection {
private ArrayList<Object> values;
public InputCollection() {
this.values = new ArrayList<>();
}
public void addValue(Value<?> value) {
System.out.println("addding " + value + " to collection");
this.values.add(value);
}
public <D> D getValue(Value<D> value, D defaultValue) {
int index = this.values.indexOf(value);
if (index == -1)
return defaultValue;
Object val = this.values.get(index);
if (val == null) {
return defaultValue;
}
return ((Value<D>)val).getValue();
}
}
其背后的想法是能够定义一组final
变量,这些变量以abstract
Value<E>
所谓的“状态” 实现该变量,如下所示:
public static final class Input<E> extends Value<E> {
public static final Input<String> STRING_ONE = new Input<String>();
public static final Input<Integer> INTEGER_ONE = new Input<Integer>();
}
然后,将这些变量添加到的实例中InputCollection
,该实例又被许多“状态”或“进程”共享。Input<E>
然后可以通过不同的状态更改an的值,然后在需要时由原始状态检索。一种共享内存模型。
这个概念已经运行了好多年(是的,这是遗留的),但是我们最近开始转向Java 8,即使实现在Java 7上也可以实现,但是这会产生编译错误。
将以下内容添加main
到上述代码示例中:
public static void main (String [] args) {
InputCollection collection = new InputCollection();
//Add input to collection
collection.addValue(Input.STRING_ONE);
collection.addValue(Input.INTEGER_ONE);
//At some later stage the values are set
Input.INTEGER_ONE.setValue(1);
Input.STRING_ONE.setValue("one");
//Original values are then accessed later
long longValue = collection.getValue(Input.INTEGER_ONE, -1);
if (longValue == -1) {
System.out.println("Error: input not set");
} else {
System.out.println("Input is: " + longValue);
}
}
如果eclipse中的Compiler Compliance级别设置为1.7,则没有编译问题,并且输出将正确地是:
addding [null] to collection
addding [null] to collection
Input is: 1
但是如果将它设置为1.8编译错误Type mismatch: cannot convert from Integer to long
就行了
long longValue = collection.getValue(Input.INTEGER_ONE, -1);
但是,如果我访问这样做的价值:
long longVal = Input.INTEGER_ONE.getValue();
没有编译问题,这令人困惑。
可以通过强制转换解决此问题,但这在整个项目中都会使用,并且需要相当多的强制性测试才能更改每次出现的情况。
Java 8中需要强制转换的变化是什么?编译变得更严格了吗?如果直接访问而不是通过集合访问值,为什么编译器不会抱怨呢?
我读了 在Java中如何从int转换为Long? 以及
将Integer转换为Long,但对我的问题并没有真正令人满意的答案。
问题答案: