autoboxing ve autounboxing nedeniyle. Bayt kodu (aşağıdaki) bakarsanız, Double.valueOf
(3.7d
numaralı kutuyu işaretleme) ve Double#doubleValue
numaralı çağrıları görebilirsiniz (koşullu ifadenin sonucunun çıkarılması). derleyici etkin bir bu işe kodunuzu çeviriyor böylece koşullu operatöre operandlar, aynı türde olmalıdır: en belirli yaygın türüdür
public double getSomeDouble() {
return ("" != null ? Double.valueOf(3.7d) : null).doubleValue();
}
... Double
çünkü 3.7d
ve null
için bulabilirsiniz. etkin bir hale gelir
public double getSomeDouble(String str) {
return str != null ? 3.7d : null;
}
:
I (gerçek asla derleyici söylemek mümkün olacaktır değişmez ifadesi
"" != null
etrafında derleyici optimizasyon ortadan kaldırmak için) bir dize argümanı kullanılır
public double getSomeDouble(String str) {
return (str != null ? Double.valueOf(3.7d) : null).doubleValue();
}
... ve null
üzerinde doubleValue()
aramayı denediğinde, için null
geçirdiğimde çalışma zamanında bir NPE var. İşte
baytkodu var benim
getSomeDouble(String)
(
javap -c MyClass
itibaren): [? İlgili]
public double getSomeDouble(java.lang.String);
Code:
0: aload_1
1: ifnull 13
4: ldc2_w #7 // double 3.7d
7: invokestatic #9 // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;
10: goto 14
13: aconst_null
14: invokevirtual #10 // Method java/lang/Double.doubleValue:()D
17: dreturn
(http://stackoverflow.com/q/8098953/1391249) – Tiny