Java Generics: Descrizione e metodi
Partendo con la comparsa del linguaggio Java ha subito molti cambiamenti, che indubbiamente ha portato momenti positivi nella sua funzionalità. Uno di questi cambiamenti significativi è l'introduzione di Java Generic o generalizzazioni. Questa funzionalità non solo rendono il linguaggio più flessibile e versatile, ma anche molto più sicuro in termini di portare i tipi di dati.
Il fatto è che prima dell'introduzione dei generici in Java codice generico può essere creato, non solo in termini di oggetto tipo di riferimento. Tali collegamenti possono essere assegnati qualsiasi oggetto. Dopo tutto, le classi in Java sono eredi classe di oggetti impliciti. Tuttavia, questo approccio è una potenziale fonte di molti errori relativi ai tipi di protezione nella conversione apparente di un oggetto dall'Oggetto al tipo di destinazione. Quando si utilizza generalizzazioni tutti i calchi sono eseguiti implicitamente ed automaticamente, eliminando anche il rischio di errori.
Java Generics: descrizione e un esempio
Consideriamo un semplice esempio di applicazione di generalizzazione alle classi regolari nella figura seguente. E quindi procedere a un esame approfondito di tutte le sottigliezze e le sfumature di Java Generic.
Prestare attenzione al modo in cui la dichiarazione di classe si verifica Pair. Subito dopo il nome della classe, angolari aperte, che indicava la lettera T. è una sorta di riempitivo, che è in fase di creazione di un'istanza di questa classe sarà sostituito da un tipo specifico. Esso appare come segue: Coppia obj = new Pair (). Va notato che, invece di T può specificare qualsiasi lettera, ma, di regola, utilizzare T, V o E.
Nota: a partire dalla ottava versione del Java, specificando il tipo di destinazione quando si dichiara parentesi angolari riferimento nel costruttore possono essere lasciati vuoti. Così, ad esempio può essere riscritta come sopra: Coppia obj = new Pair ().
Quando una classe viene dichiarata in modo tale, poi nel suo corpo, invece di specifici tipi di campi, link, oggetti restituiti dai metodi che è possibile utilizzare quella lettera. Poiché T quando si crea l'oggetto di classe è sostituito da un tipo particolare, primo e secondo campo in questo caso sarà di tipo intero.
Seguendo la logica degli argomenti e firstItem secondItem, di cui il costruttore appropriato deve anche essere di tipo intero o sottoclasse. Se si tenta di trasmettere un tipo di dati che è diverso da quello che è stato specificato durante la creazione di un oggetto, il compilatore non permetterà che questo errore. Così, il costruttore di argomenti quando sarà un oggetto come segue: Accoppiamenti obj = new Pair (new Integer (1), new Integer (2)). Lo stesso vale per gli argomenti e metodi setFirst setSecond. E come probabilmente avete indovinato, metodi getFirst getSecond e restituirà un valore di tipo Integer.
Generalizzata con tipi di classe diversi parametri
Nelle classi generalizzate possono anche dichiarare più parametri del tipo che si trova in parentesi angolari con una virgola. Ridisegnata da un caso classe di coppia è presentato di seguito.
Come si può vedere, quando si crea un'istanza di questa classe tra parentesi angolari deve indicare lo stesso numero di tipi come parametri. Se si ha familiarità con questo tipo di struttura di dati come una mappa, si può vedere che usa esattamente lo stesso principio. Lì, il primo argomento specifica il tipo di chiave, e la seconda – il tipo di valore. Va notato che i tipi di trasmissione quando un argomenti oggetto possono sovrapporsi. Ad esempio, il seguente annuncio coppia istanza di classe è assolutamente corretto: Coppia obj.
Alcune funzioni di generalizzazioni
Prima di andare avanti, si deve notare che il compilatore Java non crea diverse versioni della coppia di classe. In realtà, nel processo di compilazione di un tipo generalizzato tutte le informazioni viene eliminato. Invece, si mettono i tipi appropriati, la creazione di una versione speciale della classe Pair. Tuttavia, nel programma c'è ancora solo una versione generica della classe. Questo processo è chiamato in Java tipo di pulizia generico.
Nota un punto importante. Collegamenti a diverse versioni della stessa classe generica Java non possono puntare a uno e lo stesso oggetto. Cioè, supponiamo di avere due link: Accoppiamenti obj1 e coppia obj2. Pertanto, in linea obj1 = obj2 un errore. Anche se entrambe le variabili sono di tipo Pair , gli oggetti a cui si riferiscono, sono diversi. Questo è un primo esempio dei tipi di sicurezza in Java Generic.
Restrizioni classi generiche
È importante sapere che generalizzazioni possono essere applicati solo per fare riferimento a tipi, vale a passare parametri generici argomento java classe deve essere un tipo di classe. Questi tipi semplici, come, ad esempio, doppi o lunghi, non possono essere trasferiti. In altre parole, la dichiarazione della classe Pair seguente riga non è consentito: Coppia obj. Tuttavia, questa limitazione non è un problema serio, poiché v'è una corrispondente classe Java wrapper per ogni tipo primitivo. A rigor di termini, se la coppia di classe che si desidera incapsulare un intero e booleano valore avtoupakovka fa tutto per te: Coppia obj = new Pair (25, true).
Un'altra limitazione grave è l'incapacità di creare un'istanza del tipo di parametro. Ad esempio, la seguente riga causerà un errore di compilazione: T prima = new T (). Questo è ovvio, perché non si sa in anticipo se un argomento approvato una classe piena o astratta, o anche l'interfaccia. Lo stesso vale per la creazione di array.
limitati tipi
Molto spesso ci sono situazioni in cui è necessario limitare l'elenco dei tipi che possono essere passati come un argomento a Java classe generica. Supponiamo che nel nostro Coppia classe vogliamo incapsulare solo i valori numerici per ulteriori operazioni matematiche su di loro. Per fare questo abbiamo bisogno di definire il limite superiore del tipo di parametro. E 'realizzato per mezzo di una superclasse annunci ereditato tutti gli argomenti passati tra parentesi angolari. Sembrerà come segue: class Pair . In questo modo, il compilatore rileva che al posto del parametro T può essere sostituito o una classe Numero o una delle sue sottoclassi.
Si tratta di una reception comune. Tali restrizioni sono spesso utilizzati per fornire parametri di tipo compatibilità in una stessa classe. Si consideri l'esempio nella nostra classe Coppia: class Pair . Qui diciamo al compilatore che il tipo T può essere arbitraria, e tipo V deve essere di tipo T o una delle sue sottoclassi.
Limitare il "fondo" è esattamente nello stesso modo, ma al posto della parola si estende per scrivere la parola eccellente. Quella classe è classificato Coppia dice che invece di T può essere sostituito o un ArrayList, o di qualsiasi classe o interfaccia che eredita.
metodi Java generici e costruttori
In Java, le generalizzazioni possono essere applicati non solo alle classi, ma anche i metodi. Ad esempio, un metodo generico può essere dichiarato in una classe regolare.
Come si vede nella figura sopra, il metodo ad generalizzato è un grosso problema. Abbastanza prima il tipo di ritorno di un metodo per mettere le parentesi angolari e specificare i parametri del tipo in loro.
Se tutto è fatto in modo simile al costruttore:
Le parentesi angolari in questo caso messo prima del nome del progettista, perché non ha alcun valore di ritorno. Il risultato di entrambi i programmi saranno:
numero intero
stringa