Conversioni e promozioni in Java

Feb 22 2023
In questo articolo discuteremo la conversione primitiva. · Conversione del tipo ∘ Conversione del tipo implicita ∘ Conversione del tipo esplicita · Promozione automatica del tipo nelle espressioni · Differenza tra il casting del tipo e la coercizione del tipo tipo di dati a un altro.

In questo articolo discuteremo la conversione primitiva .

· Conversione di tipo
∘
Conversione di tipo implicita
∘
Conversione di tipo esplicita
·
Promozione automatica di tipo nelle espressioni
·
Differenza tra casting di tipo e coercizione di tipo

In informatica, la conversione del tipo , il casting del tipo , la coercizione del tipo e la manipolazione del tipo sono modi diversi di modificare un'espressione da un tipo di dati a un altro. Un esempio potrebbe essere la conversione di un valore intero in un valore in virgola mobile o la sua rappresentazione testuale come stringa e viceversa. Le conversioni di tipo possono sfruttare determinate funzionalità delle gerarchie di tipo o delle rappresentazioni dei dati. Due aspetti importanti di una conversione di tipo sono se avviene in modo implicito (automatico) o esplicito e se la rappresentazione dei dati sottostante viene convertita da una rappresentazione in un'altra o una data rappresentazione viene semplicemente reinterpretatacome rappresentazione di un altro tipo di dati. In generale, è possibile convertire sia tipi di dati primitivi che composti.

Ogni linguaggio di programmazione ha le proprie regole su come i tipi possono essere convertiti. Le lingue con tipizzazione forte in genere eseguono poche conversioni implicite e scoraggiano la reinterpretazione delle rappresentazioni, mentre le lingue con tipizzazione debole eseguono molte conversioni implicite tra tipi di dati. Un linguaggio di tipizzazione debole spesso consente di forzare il compilatore a interpretare arbitrariamente un elemento di dati come avente rappresentazioni diverse: questo può essere un errore di programmazione non ovvio o un metodo tecnico per gestire direttamente l'hardware sottostante.

Java fornisce vari tipi di dati, probabilmente qualsiasi altro linguaggio dinamico come boolean, char, int, unsigned int, sign int, float, double, long, ecc. in totale fornendo 7 tipi in cui ogni tipo di dati acquisisce spazio diverso durante l'archiviazione in memoria.

Tipo Conversione

Se hai precedenti esperienze di programmazione, allora sai già che è abbastanza comune assegnare un valore di un tipo a una variabile di un altro tipo. Se i due tipi sono compatibili, Java eseguirà automaticamente la conversione (conversione del tipo ) . Ad esempio, è sempre possibile assegnare un valore int a una variabile long. Tuttavia, non tutti i tipi sono compatibili e, pertanto, non tutte le conversioni di tipo sono consentite in modo implicito . Ad esempio, non esiste una conversione automatica definita da double a byte. Fortunatamente è ancora possibile ottenere una conversione tra tipi incompatibili. Per fare ciò, devi usare un cast , che esegue un esplicitoconversione tra tipi incompatibili . Esaminiamo sia le conversioni di tipo automatiche o di ampliamento ( type coercion , type juggling ) sia le conversioni restrittive o esplicite ( type casting ).

Come puoi vedere, è possibile eseguire un cast su un valore numerico così come su una variabile. Si noti che è possibile introdurre calchi superflui; ad esempio, il compilatore promuoverà automaticamente un valore int a lungo quando necessario. Tuttavia, puoi usare cast superflui per fare un punto o per chiarire il tuo codice. In altre situazioni, un cast può essere essenziale solo per far compilare il codice.

In C e C++, la conversione del tipo può causare alcuni grattacapi. In Java, la conversione è sicura, con l'eccezione che quando si esegue una cosiddetta conversione di restringimento (ovvero, quando si passa da un tipo di dati che può contenere più informazioni a uno che ne contiene meno), si esegue il rischio di perdere informazioni. Qui il compilatore ti costringe a usare un cast (casting di tipo) , in effetti dicendo: "Questa può essere una cosa pericolosa da fare - se vuoi che lo faccia comunque devi rendere esplicita la conversione.” Con una conversione di ampliamento non è necessario un cast (cast esplicito), perché il nuovo tipo manterrà più che le informazioni dal vecchio tipo in modo che nessuna informazione venga mai persa. Java ti consente di convertire qualsiasi tipo primitivo in qualsiasi altro tipo primitivo, ad eccezione di boolean, che non consente alcun casting. I tipi di classe non consentono il casting. Per convertire l'uno nell'altro, devono esserci metodi speciali. (…)

Conversione di tipo implicita

Conosciuto anche come 'conversione di tipo automatico o wedninig'.

  • Fatto dal compilatore da solo, senza alcun trigger esterno da parte dell'utente.
  • Generalmente si verifica quando in un'espressione è presente più di un tipo di dato. In tale condizione avviene la conversione del tipo (promozione del tipo) per evitare la perdita di dati.
  • Tutti i tipi di dati delle variabili vengono aggiornati al tipo di dati della variabile con il tipo di dati più grande.
  • bool -> char -> short int -> int -> 
    
    unsigned int -> long -> unsigned -> 
    
    long long -> float -> double -> long double
    

  • I due tipi sono compatibili. Ad esempio, i tipi di dati come numeric sono compatibili con altri tipi di dati numerici, ma non sono compatibili con i tipi di dati boolean , char o String . Allo stesso modo in cui String non è compatibile con un tipo di dati booleano .
  • Il tipo di destinazione è più grande del tipo di origine.

È possibile che le conversioni implicite perdano informazioni, i segni possono essere persi (quando sign viene convertito implicitamente in unsigned) e può verificarsi un overflow (quando long long viene convertito implicitamente in float).

a volte ci riferiamo a questo tipo di conversione come tipo ceorcion.

In Java, il meccanismo di conversione di un tipo di oggetto in un altro oggetto di tipo diverso con contenuto simile è noto come coercizione. In altre parole, possiamo dire che la coercizione è il processo di conversione di un tipo di dati in un altro tipo di dati. In modo più specifico, la conversione implicita è chiamata coercizione . È anche noto come coercizione di tipo .

Nel tipo ceorcion , un tipo di dati viene convertito automaticamente in un altro tipo di dati da un compilatore al momento del compilatore. Nel tipo ceorcion , il tipo di dati di destinazione non può essere inferiore al tipo di dati di origine, ecco perché è anche chiamato conversione di ampliamento. Un'altra cosa importante è che può essere applicata solo a tipi di dati compatibili.

Tipo Ceorcion esempio –

int x=30;
float y;
y=x;  // y==30.000000.

Java costringerà automaticamente i dati nella direzione delle frecce, continue o tratteggiate. Per esempio:

Le coercizioni che attraversano una freccia tratteggiata sono consentite ma possono comportare una perdita di precisione. Significa che il valore convertito potrebbe non essere uguale al valore iniziale. Per esempio:

Il compilatore genera un errore se un'istruzione tenta di forzare i dati rispetto alla direzione delle frecce.

Diamo un'occhiata a un esempio di casting di tipo implicito in Java.

Qui convertiremo un valore int in un valore long e infine in un valore double utilizzando un semplice operatore di assegnazione:

public class Main {
  public static void main(String[] args) {
    int a = 20;
    long b = a;     //implicit casting from int to long data type
    double c = b; 
    System.out.println(a);
    System.out.println(b);
    System.out.println(c);
  }
}  // implicit casting from long to double data type

20
20
20.0

In altre parole, la "conversione di tipo" si riferisce al processo generale di modifica di un tipo, mentre la coercizione di tipo si riferisce più specificamente alla conversione implicita di un tipo. Possiamo ulteriormente suddividere la coercizione di tipo in due tipi: controllata dal programmatore e controllata dal compilatore (a volte indicata come giocoleria ).

Conversione di tipo esplicita

Sebbene le conversioni automatiche dei tipi siano utili, non soddisfano tutte le esigenze. Ad esempio, cosa succede se si desidera assegnare un valore int a una variabile byte? Questa conversione non verrà eseguita automaticamente, perché un byte è più piccolo di un int. Questo tipo di conversione è talvolta chiamato casting di tipo ed è definito dall'utente.

Questo processo è anche chiamato conversione del tipo di restringimento, poiché stai esplicitamente restringendo il valore in modo che rientri nel tipo di destinazione.

Per creare una conversione tra due tipi incompatibili, è necessario utilizzare un cast di tipi. Un cast è semplicemente una conversione di tipo esplicita.

In Java, può essere fatto usando un operatore cast () :

Questo viene fatto definendo in modo esplicito il tipo richiesto davanti all'espressione tra parentesi.

Ha questa forma generale:

(target-type) expression

Qui, target-type specifica il tipo desiderato in cui convertire il valore specificato. Ad esempio, il frammento seguente esegue il cast di un int in un byte . Se il valore dell'intero è maggiore dell'intervallo di un byte , verrà ridotto modulo (il resto di una divisione intera per il) intervallo del byte.

int a; 
byte b; // … 
b = (byte) a;

Il seguente programma mostra alcune conversioni di tipo che richiedono cast:

// Demonstrate casts.
class Conversion {
public static void main(String args[]) {
byte b;
int i = 257;
double d = 323.142;
System.out.println("\nConversion of int to byte.");
b = (byte) i;
System.out.println("i and b " + i + " " + b);
System.out.println("\nConversion of double to int.");
i = (int) d;
System.out.println("d and i " + d + " " + i);
System.out.println("\nConversion of double to byte.");
b = (byte) d;
System.out.println("d and b " + d + " " + b);
}
}

Conversion of int to byte. i and b 257 1 
Conversion of double to int. d and i 323.142 323 
Conversion of double to byte. d and b 323.142 67

Diamo un'occhiata a un esempio di casting esplicito in Java:

public class Main  {  
  public static void main(String args[])  {  
    double d = 57.17;  
    int i = (int)d;  // Explicit casting from long to int data type
    System.out.println(d);  
    System.out.println(i);  //fractional part lost
  }  
}

57.17
57
57

Promozione automatica del tipo nelle espressioni

La promozione del tipo è un evento comune nella programmazione Java, che può essere ottenuta automaticamente con tipi di dati primitivi tramite l'uso della promozione del tipo automatico. Viene anche definita promozione automatica del tipo di dati.

Come forse saprai, oltre agli assegnamenti, esiste un altro luogo in cui possono verificarsi determinate conversioni di tipo: nelle espressioni.

Di seguito è riportata un'illustrazione schematica delle possibili promozioni di tipo:

Scoprirai che se esegui operazioni matematiche o bit per bit su tipi di dati primitivi che sono più piccoli di un int (ovvero char, byte o short), quei valori verranno promossi a int prima di eseguire le operazioni e il risultante il valore sarà di tipo int. Quindi, se vuoi assegnare di nuovo al tipo più piccolo, devi usare un cast. (E poiché stai assegnando di nuovo a un tipo più piccolo, potresti perdere informazioni.) In generale, il tipo di dati più grande in un'espressione è quello che determina la dimensione del risultato di quell'espressione; se moltiplichi un float e un double, il risultato sarà double; se aggiungi un int e un long, il risultato sarà long.

Per capirci di più:

considerare quanto segue. In un'espressione, la precisione richiesta per un valore intermedio a volte supera l'intervallo di entrambi gli operandi. Ad esempio, esaminare la seguente espressione:

byte a = 40;
byte b = 50;
byte c = 100;
int d = a * b / c;

Per quanto utili siano le promozioni automatiche, possono causare errori di compilazione confusi. Ad esempio, questo codice apparentemente corretto causa un problema:

byte b = 50;
b = b * 2; // Error! Cannot assign an int to a byte!

Nei casi in cui comprendi le conseguenze dell'overflow, dovresti utilizzare un cast esplicito, ad esempio

byte b = 50;
b = (byte)(b * 2);

Regole per la promozione automatica del tipo

Le seguenti regole per la promozione del tipo devono essere seguite durante l'esecuzione di espressioni in Java per ottenere risultati corretti:

  • Tutte le variabili di tipo byte , short e char devono essere promosse automaticamente a int .
  • Se una variabile che prende parte a un'operazione è long , il risultato dell'operazione deve essere long .
  • Se qualsiasi variabile che prende parte a un'operazione è float , il risultato dell'operazione deve essere float .

Vediamo alcuni esempi Java che descrivono le regole di promozione numerica in Java-

1- Quando uno degli operandi è doppio.

public class PromotionExample {
 public static void main(String[] args) {
  int i = 30;
  double d = 2.5;
  double result = i * d;
  System.out.println("Result is- " + result);
 }
}
// output :
// Result is- 75.0

2- Quando uno degli operandi è float.

public class PromotionExample {
 public static void main(String[] args) {
  short s = 4;
  int i = 30;
  float f = 6.75f;
  float result = (s+i) * f;
  System.out.println("Result is- " + result);
 }
}
//output
// Result is- 229.5

3- Tentativo di assegnare il risultato a int quando uno degli operandi è float.

public class PromotionExample {
 public static void main(String[] args) {
  byte a= 100;
  byte b= 50;
  int i= 80;
  float f = 80;
  result = f/i *b; // line 6
 }
}

      
                
error line 6

Vediamo la differenza tra Type casting e Type Coercion che sono riportati di seguito:

  1. Nel casting di tipo, un tipo di dati viene convertito in un altro tipo di dati da un programmatore utilizzando l'operatore di casting. Mentre nella coercizione del tipo, un tipo di dati viene convertito in un altro tipo di dati da un compilatore.
  2. Il casting di tipo può essere applicato a tipi di dati compatibili così come a tipi di dati incompatibili . Mentre la coercizione del tipo può essere applicata solo a tipi di dati compatibili .
  3. Nel casting di tipo, l'operatore di casting è necessario per trasmettere un tipo di dati a un altro tipo di dati. Mentre nella coercizione di tipo, non è necessario un operatore di casting.
  4. Nel cast del tipo ( conversione esplicita del tipo), il tipo di dati di destinazione può essere più piccolo del tipo di dati di origine, quando si converte il tipo di dati in un altro tipo di dati. Mentre nella coercizione del tipo (conversione di tipo implicito ), il tipo di dati di destinazione non può essere più piccolo del tipo di dati di origine.
  5. Il casting del tipo avviene durante la progettazione del programma da parte del programmatore. Mentre la conversione del tipo ( conversione del tipo implicita ) viene eseguita al momento della compilazione.
  6. Il casting del tipo è anche chiamato conversione di restringimento perché in questo caso il tipo di dati di destinazione può essere più piccolo del tipo di dati di origine. Considerando che la coercizione del tipo ( conversione di tipo implicito ) è anche chiamata conversione di ampliamento perché in questo caso il tipo di dati di destinazione non può essere più piccolo di il tipo di dati di origine.
  7. Il casting del tipo viene spesso utilizzato nella codifica e nei lavori di programmazione competitiva. Mentre la coercizione del tipo ( conversione del tipo implicita ) è meno utilizzata nella codifica e nella programmazione competitiva in quanto potrebbe causare una risposta errata.
  8. Il casting di tipo è più efficiente e affidabile, mentre la coercizione di tipo ( conversione di tipo implicita ) è meno efficiente e meno affidabile.

Sostieni la nostra pubblicazione seguendola

Si vedano anche i seguenti articoli.

2023 React JS Trends to Watch The Click jacking e le sue misure preventive Integrazione Splunk con SpringBoot Parte - 1 Codifica: controlla se due stringhe sono anagrammi in Javascript Perché Java è il linguaggio di programmazione più amato del pianeta Comprendere i metodi in Java 5 domande comuni su JavaScript: Introduzione all'architettura Spark 25. La più grande sottostruttura di ricerca binaria (BST)