Qualcuno può spiegare perché si dovrebbe mai utilizzare la conversione di allargamento o restringimento? Ho letto molto su questi, ma nessuno mi dà mai un esempio pratico. Grazie!Applicazione del mondo reale di conversione allargamento/restringimento?
risposta
(Java) Le conversioni di allargamento e restringimento hanno a che fare con la conversione tra tipi correlati. Prendiamo, ad esempio, la relazione tra una classe astratta (super) e la sua sottoclasse (secondaria); usiamo la classe java.lang.Number (abstract) e una sottoclasse diretta integer. Qui abbiamo:
(superclass) Number
__________/\__________
/ | | \
(concrete subclasses) Integer Long Float Double
Allargamento Conversione: verifica se prendiamo un tipo specifico (sottoclasse) e si tenta di assegnare a un tipo meno specifico (superclasse).
Integer i = new Integer(8);
Number n = i; // this is widening conversion; no need to cast
conversione Narrowing: si verifica quando prendiamo un tipo meno specifico (superclasse) e si tenta di assegnare a un tipo più specifico (sottoclasse), che richiede cast esplicito.
Number n = new Integer(5); // again, widening conversion
Integer i = (Integer) n; // narrowing; here we explicitly cast down to the type we want - in this case an Integer
ci sono alcune questioni che è necessario essere a conoscenza di quali ClassCastExceptions:
Integer i = new Integer(5);
Double d = new Double(13.3);
Number n;
n = i; // widening conversion - OK
n = d; // also widening conversion - OK
i = (Integer) d; // cannot cast from Double to Integer - ERROR
// remember, current n = d (a Double type value)
i = (Integer) n; // narrowing conversion; appears OK, but will throw ClassCastException at runtime - ERROR
Un modo per gestire questa situazione è quello di utilizzare un if
dichiarazione con la parola chiave instanceof
:
if(n instanceof Integer) {
i = (Integer) n;
}
Perché vuoi usare questo? Diciamo che stai facendo una gerarchia di personale per alcuni programmi e hai una superclasse generica chiamata "Persona" che prende un nome e un cognome come parametri e sottoclassi "Studente", "Insegnante", "Segretario", ecc. puoi inizialmente creare una persona generica e assegnarla (tramite ereditarietà), ad esempio, a uno studente che avrebbe un campo variabile aggiuntivo per studenID impostato nel suo costruttore. È possibile utilizzare un unico metodo che prende le più generiche (più ampi) di tipo come parametro e di gestire tutte le sottoclassi di quel tipo così:
public static void main(String[] args) {
Person p = new Student("John", "Smith", 12345);
printInfo(p);
}
// this method takes the wider Person type as a parameter, though we can send it a narrower type such as Student if we want
public static void printInfo(Person p) {
System.out.println("First: " + p.getFirstName());
System.out.println("Last: " + p.getLastName());
if (p instanceof Student) {
System.out.println((Student)p).getStudentID()); // we cast p to Student with Narrow Conversion which allows us to call the getStudentID() method; only after ensuring the p is an instance of Student
}
}
Mi rendo conto che questo potrebbe non essere il modo ideale per gestire le cose, ma per Per motivi di dimostrazione, ho pensato che servisse per mostrare alcune delle possibilità.
Se un codice restituisce un valore int
contenente un valore vero/falso, è possibile ridurlo manualmente a un valore bool
che rappresenta ciò che rappresenta correttamente.
Puoi anche fare il contrario.
È possibile ampliare un char
a int
per fare alcuni confronti con i valori ascii.
È possibile prendere un'istanza di Dog
e ampliarla a IAnimal
per passarla a una funzione.
È possibile ridurre uno IAnimal
a Dog
quando si conosce il tipo di animale in uno List<IAnimal>
in una fabbrica o altrove per qualsiasi motivo.
In java no non puoi convertire un int in un booleano, è più una particolarità che ha causato così tanti bug che non è nemmeno più divertente. – Voo
Le conversioni implicite vengono utilizzate per eseguire calcoli matematici con valori numerici di tipi diversi. Ad esempio, se now()
restituisce un timestamp in secondi, come un lungo:
long t = now()
long nextMinute = t + 60
avete fatto una conversione implicita ampliamento di 60 (un int) per un lungo in modo da poter aggiungere al t
. Essere in grado di fare queste conversioni rende la matematica molto più facile da codificare.
Un esempio canonico di conversione di allargamento e restringimento è il modo in cui funzionano determinate librerie di I/O di file. Spesso, una libreria di elaborazione file avrà una funzione/metodo che legge un singolo carattere da un file. Se c'è un carattere da leggere, la funzione dovrebbe restituire quel carattere e, se non ci sono caratteri, dovrebbe restituire un valore sentinella EOF per segnalarlo.
Perché qualsiasi carattere può apparire in un file, in genere la funzione/metodo sarebbe avere questa firma:
int readCharacter();
Qui, la funzione restituisce un int
che contiene un valore char
se un personaggio è stato letto e che detiene EOF
come sentinella altrimenti. EOF
viene in genere scelto come numero intero troppo grande da contenere in un char
. In questo modo, puoi fare ciò:
while (true) {
int ch = readCharacter();
if (ch == EOF) break;
char actualCharValue = (char) ch;
/* process actualCharValue here */
}
Spero che questo aiuti!
prendere questa ...
conversione - Specialized -> generalizzata, allora è conosciuto come Widening, quando si sono sempre più generale.
Come Chirurgo -> Medico. In questo caso, non hai bisogno di un casting. Perché, un chirurgo è un Medico di default. Quindi, è naturale che un chirurgo possa eseguire tutte quelle cose che un Medico può fare.
Mentre d'altra parte, Conversione - Generalizzato -> Specializzato, quindi è noto come restringimento, quando si sta diventando più specializzato.
Come Medico -> Chirurgo. Bene, in questo caso, devi aggiungere casting. Perché un medico può essere un chirurgo o un medico o un'infermiera. Pensaci, se chiedi a un'infermiera di operare su di te ...
Orribile, giusto ???
Spero che tu abbia avuto l'idea.
- 1. Statistiche di errore del mondo reale?
- 2. Uso del guardiano del mondo reale
- 3. ORM nel mondo reale
- 4. Domande redux sull'esempio del mondo reale
- 5. Glassfish nel mondo reale
- 6. C# 4: Esempio di tipi dinamici del mondo reale
- 7. Esempio di mondo reale di Paxos
- 8. utilizzo di unità del mondo reale, invece di tipi
- 9. Cercare il mondo reale Esempi di gradi
- 10. Uso del mondo reale di attributi personalizzati .NET
- 11. Backbone.js: rendering di raccolte in app del mondo reale
- 12. Un caso di utilizzo del mondo reale per BufferManager
- 13. Occlusione di oggetti del mondo reale usando three.js
- 14. Test sul mondo reale dei controller CakePHP?
- 15. Relazionare i problemi NP-Complete ai problemi del mondo reale
- 16. GUI Frameworks per C++ Applicazioni del mondo reale
- 17. Java Multi Threading - casi d'uso del mondo reale
- 18. Qualcuno ha esperienza del mondo reale con Buckminster?
- 19. Qualche esperienza del mondo reale con il database H2?
- 20. Quanto sono accurate le unità del mondo reale dei CSS?
- 21. Reimplementare strutture dati nel mondo reale
- 22. Analogico mondo reale a TIS-100
- 23. Ridimensionamento dei contenitori Docker nel mondo reale
- 24. Esempio di mondo reale di GraphQLInterfaceType e GraphQLUnionType
- 25. Esempio di applicazione reale del modello di comando
- 26. Due parter: raccomandazione del libro di Django + consiglio del mondo reale di Django
- 27. Schemi di database non validi nel mondo reale
- 28. Implementazione dell'autenticazione del server di identità nello scenario del mondo reale
- 29. Confronti nel mondo reale di Glassfish e JBoss 5?
- 30. Problemi nel mettere la logica del mondo reale nel livello di dominio DDD
Ci sono milioni di esempi, dovresti incontrarli ogni giorno scrivendo il codice. –
Sono uno studente e ho studiato solo programmazione per alcuni anni e non mi sono mai imbattuto in questo prima, scusa. Se ci fossi imbattuto in questo, non avrebbe senso chiedere questa domanda, ma grazie per la critica. –