Java VM不能与“android.util.*`”一起使用:不能使用零以外的值初始化可变类
我使用的是Android Studio 3.1.2,API级别为26,最小API为21。我检查并看到包android.util的类型为MutableDouble,实现如下:Java VM不能与“android.util.*`”一起使用:不能使用零以外的值初始化可变类,java,android,Java,Android,我使用的是Android Studio 3.1.2,API级别为26,最小API为21。我检查并看到包android.util的类型为MutableDouble,实现如下: package android.util; /** */ public final class MutableInt { public int value; public MutableInt(int value) { this.value = value; } } MutableDouble d
package android.util;
/**
*/
public final class MutableInt {
public int value;
public MutableInt(int value) {
this.value = value;
}
}
MutableDouble d = new MutableDouble(999d);
System.out.println("Received value: " + d.value);
=> "Received value: 0.0"
但当我用特定的输入值初始化MutableDouble的新实例时,它总是收到零值,如下所示:
package android.util;
/**
*/
public final class MutableInt {
public int value;
public MutableInt(int value) {
this.value = value;
}
}
MutableDouble d = new MutableDouble(999d);
System.out.println("Received value: " + d.value);
=> "Received value: 0.0"
我必须直接设置值才能使其工作
MutableDouble d = new MutableDouble(999d);
d.value = 777d;
System.out.println("Received value: " + d.value);
=> "Received value: 777.0"
我已经将上述MutableDouble的实现复制到了我自己的项目中,它按照预期工作
检查其他类似的类,如MutableInt、MutableFloat等,它们都有相同的问题
有没有人像我一样面对这个问题?Android Studio中的任何错误配置都会导致这种情况?我相信这些功能是正确的,因此在使用Android Studio>=3.1.0 Android p SDK时将无法正常工作。我不知道他们为什么不赞成MutableInt,MutableDouble,。。。类,但会假定这是因为通过引用传递文本对于异步应用程序来说非常危险,而且它们是非常容易实现的类!我建议使用原子长,如下所示:
AtomicLong d = new AtomicLong(Double.doubleToLongBits(99.9));
System.out.println("Double is set to " + Double.longBitsToDouble(d.longValue()));
通过引用传递会更安全
还有一个AtomicDouble类,如果你带上番石榴包装还可以使用
另一个想法是使用AtomicLong创建自己的简单AtomicDouble类,如下所示:
import java.util.concurrent.atomic.AtomicInteger;
import static java.lang.Double.*;
class AtomicDouble extends Number {
private AtomicLong bits;
public AtomicDouble() {
this(0.0);
}
public AtomicDouble(double initialValue) {
bits = new AtomicInteger(doubleToLongBits(initialValue));
}
public final boolean compareAndSet(double expect, double update) {
return bits.compareAndSet(doubleToLongBits(expect),
doubleToLongBits(update));
}
public final void set(double newValue) {
bits.set(doubleToLongBits(newValue));
}
public final double get() {
return longBitsToDouble(bits.get());
}
public double doubleValue() {
return get();
}
public final float getAndSet(double newValue) {
return longBitsToDouble(bits.getAndSet(doubleToLongBits(newValue)));
}
public final boolean weakCompareAndSet(double expect, double update) {
return bits.weakCompareAndSet(doubleToLongBits(expect),
doubleToLongBits(update));
}
public float floatValue() { return (float) doubleValue(); }
public int intValue() { return (int) get(); }
public long longValue() { return (long) get(); }
}
我已经发现,在本机JavaVM上运行测试时会出现问题。在安卓虚拟机上运行测试,测试结果与预期一致 重读一遍,我想名称空间android.*下的所有包都必须与android VM一起使用才能正常工作
想知道为什么在Java虚拟机上运行测试时没有警告/错误消息来通知这种情况。Huh,我无法重现,这很奇怪。我能看到的唯一区别是我在Android Studio 3.0中。1@Popmedic谢谢你的努力。我已经检查了我的另一台电脑与同一个项目,它仍然发生。我将尝试使用新项目来查看任何差异。我想知道这是否是因为他们不赞成该类。我强烈建议不要使用这样的可变类,因为并发存在风险。也许可以使用AtomicLong来代替:AtomicLong d=new AtomicLongDouble.doubleToLongBits99.9;System.out.PrintLndoull设置为+Double.longbitstodouble.longValue;我想知道这是否是因为他们不赞成这门课:是的,我也想知道。但这并不是贬低某些东西的好方法。感谢您关于并发性的建议,我使用这些可变类是因为这是一种在Java中传递参数作为函数引用的简单方法。您的答案是更多细节和更多方法。所以我选择它来回答我的问题,而不是我的问题。