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.Datetürünün, Timestamp/ Timeçifti için "En Küçük Ortak Üst Sınıf" olduğu için fark edeceksiniz .
Yana nullhiçbir şeye autoboxed edilebilir "Asgari Ortak Üst sınıf" dir Integersı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 Integera NullPointerExceptionatılır. JVM girişimleri işlevini çağırmak için Bunun nedeni null.intValue(), nullAutoboxing 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 : param2Derleyici 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 nulldeğ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 intolamaz null...
int foo = (true ? null : 0)venew Integer(null)her ikisi de iyi derleme, ikincisi otomatik kutulamanın açık şeklidir.