Akılda tutulması gereken ilk şey, Java üçlü operatörlerinin bir "tip" e sahip olması ve ikinci veya üçüncü parametrenin gerçek / gerçek türleri ne olursa olsun, derleyicinin belirleyeceği ve dikkate alacağı şeydir. Çeşitli faktörlere bağlı olarak, üçlü operatör tipi, çizimde gösterildiği gibi farklı şekillerde belirlenir. Java Dil Spesifikasyonu 15.26'da
Yukarıdaki soruda son durumu dikkate almalıyız:
Aksi takdirde, ikinci ve üçüncü işlenenler sırasıyla S1 ve S2 tipindedir. T1 , S1'e boks dönüşümü uygulanmasından kaynaklanan tür olsun ve T2 , S2'ye boks dönüşümü uygulanmasından kaynaklanan tür olsun . Koşullu ifadenin türü, lub'a (T1, T2) (§15.12.2.7) yakalama dönüşümü (§5.1.10) uygulanmasının sonucudur .
Bu, yakalama dönüşümünü (§5.1.10) ve en önemlisi lub'ta (T1, T2) bir kez baktığınızda en karmaşık durumdur .
Sade İngilizce'de ve aşırı basitleştirmeden sonra, süreci ikinci ve üçüncü parametrelerin "En Küçük Ortak Süper Sınıfı" (evet, LCM'yi düşünün) hesaplamak olarak tanımlayabiliriz. Bu bize üçlü operatör "tip" verecektir. Yine, az önce söylediğim şey aşırı basitleştirmedir (birden fazla ortak arabirimi uygulayan sınıfları düşünün).
Örneğin, aşağıdakileri denerseniz:
long millis = System.currentTimeMillis();
return(true ? new java.sql.Timestamp(millis) : new java.sql.Time(millis));
Ortaya çıkan koşullu ifadenin java.util.Date
türünün, Timestamp
/ Time
çifti için "En Küçük Ortak Üst Sınıf" olduğu için fark edeceksiniz .
Yana null
hiçbir şeye autoboxed edilebilir "Asgari Ortak Üst sınıf" dir Integer
sınıf ve bu yukarıdaki koşullu ifadenin (üçlü operatör) dönüş tipi olacaktır. Dönüş değeri daha sonra tipte bir boş gösterici olacaktırInteger
olacaktır ve üçlü operatör tarafından döndürülecek olan budur.
Çalışma zamanında, Java Sanal Makinesi kutusundan çıktığında Integer
a NullPointerException
atılır. JVM girişimleri işlevini çağırmak için Bunun nedeni null.intValue()
, null
Autoboxing sonucudur.
Benim düşünceme göre (ve benim fikrim Java Dil Spesifikasyonunda olmadığı için birçok kişi yine de yanlış bulacak) derleyici sorunuzdaki ifadeyi değerlendirmede kötü bir iş çıkarıyor. true ? param1 : param2
Derleyici yazdığınız göz önüne alındığında, derhal ilk parametrenin - null
- döndürüleceğini ve bir derleyici hatası oluşturması gerektiğini belirlemelidir . Bu, yazarken while(true){} etc...
ve derleyici döngünün altındaki koddan şikayet edip işaretlediğinde biraz benzer Unreachable Statements
.
İkinci davanız oldukça basit ve bu cevap zaten çok uzun ...;)
DÜZELTME:
Başka bir analizden sonra, bir null
değerin herhangi bir şeye kutulanabileceğini / otomatik olarak kutulanabileceğini söylemenin yanlış olduğuna inanıyorum . Sınıf Integer hakkında konuşmak, açık boks new Integer(...)
yapıcı ya da belki Integer.valueOf(int i);
(Bu sürümü bir yerde buldum) çağırmak oluşur . Birincisi alamazdı NumberFormatException
(ve bu gerçekleşmez), ikincisi mantıklı olmaz çünkü bir int
olamaz null
...
int foo = (true ? null : 0)
venew Integer(null)
her ikisi de iyi derleme, ikincisi otomatik kutulamanın açık şeklidir.