Per esempio:Perché il compilatore Java a volte consente l'annullamento del blocco di null?
int anInt = null;
fallisce al momento della compilazione, ma
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.println("" + getSomeVal());
}
}
public static int getSomeVal() {
return new Random().nextBoolean() ? 1 : null;
}
fallisce (di solito) in fase di esecuzione. Provare a restituire solo null
comporterà anche un errore di compilazione, quindi presumo ci sia qualcosa sull'avere più percorsi che induca il compilatore a dedurre che null
è potenzialmente un autoboxed int
? Perché javac non riesce a compilare entrambi i casi con lo stesso errore?
Il primo caso implica un "tipo" nullo che viene inoltrato implicitamente a un tipo int, r esultando in un errore del compilatore.Il secondo caso converte implicitamente null nel tipo di variabile di sinistra, che è il tipo di espressione piuttosto che il valore di ritorno. Immagino una lettura attenta di JLS 15.25 "Se il secondo e il terzo operando hanno lo stesso tipo (che può essere il tipo nullo), allora questo è il tipo di espressione condizionale." questo ti dà, dato che il compilatore java non può dare a null un tipo di int e quindi è costretto a usare Integer per entrambi unboxing del 1. Risposta molto chiara, grazie. – MilesHampson