2013-06-18 16 views
5

Ho due funzioni. Uno funziona bene, mentre l'altro non si compila. Non è in grado di individuare la causa. Puoi per favore aiutarmi qui?Valori di ritorno in una funzione statica - Java

Questo funziona bene

static byte method1() { 
    final short sh1 = 2; 
    return sh1; 
    } 

Questo non viene compilato

static byte method2(final short sh2) { 
return sh2; 
} 
+0

Avresti dovuto pubblicare il messaggio di errore del compilatore, e dovresti anche avere * letto * il messaggio di errore del compilatore, e ho cercato di dare un senso a questo, prima. – EJP

+0

Il compilatore (come l'editor) dice chiaramente, l'ho lanciato in byte. Ma la mia domanda è più ampia, come funziona senza un cast in prima funzione, ma non nel secondo. –

risposta

11

Nel vostro primo esempio, è sh1final, e ha un valore che può essere determinato al momento della compilazione per essere "castrato verso il basso" ad un byte. In effetti, è una costante. Se rimuovi lo final, non verrà più compilato.

Nel secondo esempio, non è possibile determinare dal compilatore che l'argomento del metodo sia "sicuro", è necessario eseguire un cast esplicito, come indicato in altre risposte.

Per i dettagli nitty, vedere here (riferimenti JLS e tutti). Ma un semplice esempio:

final byte b1 = 127; 
final byte b2 = 1; 
final byte b = b1 + b2; // <-- FAIL: 128 greater than Byte.MAX_VALUE 

final byte b1 = 12; 
final byte b2 = 3; 
final byte b = b1 + b2; // <-- SUCCESS: 15 fits 
+0

amo l'analogia "castrata" :) –

0

“finale” finale in fase di esecuzione.

Nel metodo 1

final short sh1 = 2;//// determined value at run-time.So compiles. 

dovete lanciare it.You stanno passando breve e ritorna come byte.

static byte method2(final short sh2) { 

     return (byte) sh2; 

    } 

Is "final" final at runtime?

3

Primo metodo:

Primo metodo si dichiara una variabile il cui valore è final short2 all'interno della gamma di byte. sh1 in quel primo metodo non può contenere nessun altro valore diverso da 2 determinato al momento della compilazione stesso. Se rimuovi lo final, vedrai il compilatore lamentarsi.

Secondo metodo:

È necessario lanciare short-byte come questo è una conversione restringimento e si deve assicurare il compilatore che lo fate deliberatamente e conoscere le sue conseguenze perché final short sh2 può avere qualsiasi valore che dovrebbe o non dovrebbe essere nell'intervallo byte.

static byte method2(final short sh2) 
{ 
    return (byte)sh2; 
} 
+0

Sì, ma perché il "casting" non è richiesto per il primo? –

0

Java è un linguaggio fortemente tipizzato. Nelle lingue fortemente tipizzate devi eseguire il casting di tipo esplicito. La mancata corrispondenza del tipo di dati porterà ad errori nelle lingue fortemente tipizzate.

Nel codice si passa short e si restituisce byte. Quindi il codice dovrebbe essere il seguente,

static byte method2(final short sh2) 
{ 
    return (byte) sh2; 
} 
1

Anche come esperimento se si rimuove l'incarico dal primo ad es.

static byte method1() { 
     final short sh1; 
     return sh1; 
     } 

Quindi questo non viene compilato. Quindi, proprio come il secondo, il compilatore non è sicuro della sicurezza del tipo perché il valore è passato alla funzione, lo stesso accade se rimuovi l'assegnazione dalla prima.