2015-02-09 9 views
15

Si consideri il seguente frammento di codice:Il cast implicito del tipo non funziona per i parametri del metodo?

class TypeCast{ 
    public static void main(String[] args){ 
    byte by = 4;  //compiler casts int literal to byte 

    doCasting(4); //Compilation Error: external type casting is required. WHY ? 

    } 

    public static void doCasting(byte by){ 

    } 

} 

Penso codice di cui sopra frammento è abbastanza auto-esplicativo. Mentre l'assegnazione letterale int al tipo byte, il compilatore esegue automaticamente la trasmissione richiesta. La stessa cosa non accade quando chiamiamo un metodo che utilizza il parametro byte con letterale int. Perché?

+0

Non è possibile. Una costante numerica di base è considerata un numero intero, quindi è necessario ridistribuirla esplicitamente a un byte per passarla come parametro. Per quanto ne so, non esiste una scorciatoia. [Fonte] (http://stackoverflow.com/questions/5193883/how-do-you-specify-a-byte-literal-in-java) – Milkmaid

risposta

14

Questa è la differenza tra un contesto assegnazione (JLS 5.2) e un contesto invocazione (JLS 5.3) per le conversioni.

conversioni context Assegnazione includono:

Inoltre, se l'espressione è un'espressione costante (§15.28) di tipo byte, short, char o int:

  • Un ambito conversione primitiva può essere usato se il tipo della variabile è byte, short o char e il valore dell'espressione costante è rappresentabile nel tipo della variabile.

Questo non è presenti nelle conversioni contesto invocazione.

Non è chiaro perché il linguaggio è stato progettato in questo modo, oltre a semplificare eventualmente la risoluzione di sovraccarico - se si ha:

doCasting(5); 
... 
doCasting(int x) {} 
doCasting(byte b) {} 

allora si potrebbe discutere per una delle quali è il "migliore corrispondenza" - byte è un tipo più specifico di int, ma se si pensa al letterale di tipo int, il sovraccarico di byte richiede una conversione, mentre il sovraccarico di int non lo è.

Rendendo la byte sovraccarico semplicemente non applicabile, la questione viene rimosso.

+1

In accordo con "la risoluzione di sovraccarico". Alternativa: introdurre il suffisso del tipo di byte oltre a L. – laune

+0

@laune: certo, questa è un'ottima alternativa. Ero più guardando a quello che era già presente che cercare di pensare a rimedi :) –

+1

Non direi che "grande", quello che con ... B agguato lì per binario, anche via del ritorno poi, o 0x10B. Anche la 'L' è un eviL necessario. – laune

Problemi correlati