Ho il codice seguente:Java Generics è una decisione "Tutto o niente"?
public class Main {
public static void main(String[] args) {
Generic generic = new Generic<Integer>(5);
List<String> stringList = generic.getStringList(); // this line is where the compiler complains
}
}
public class Generic<T> {
private T member;
public Generic(T member) {
this.member = member;
}
public T getMember() {
return member;
}
public List<String> getStringList() {
return new ArrayList<String>();
}
}
Nota che la classe Generic
viene dichiarato con un parametro di tipo generico, ma la variabile generic
nel metodo main
è del tipo cancellazione, i. e. senza un parametro di tipo. Quello che non capisco è il motivo per cui il compilatore si lamenta la linea con l'assegnazione del List<String>
:
Warning:(6, 56) java: unchecked conversion
required: java.util.List<java.lang.String>
found: java.util.List
il metodo restituisce chiaramente un List<String>
, indipendentemente dal parametro generico della classe. E questo è ciò che la variabile stringList
prevede. Sembra che non utilizzare il parametro generico a livello di classe per la variabile generic
disattiva l'elaborazione di tutti i generici e non solo quella in base al parametro di tipo della classe.
Sto utilizzando il compilatore Oracle Java 1.7.0_55 standard, se questo è importante.
Non sto chiedendo come eliminare l'avviso. So che dovrei dichiarare il tipo di variabile come Generic<Integer>
o utilizzare @SuppressWarnings("unchecked")
. Le mie domande sono le seguenti:
Questo comportamento è documentato?
Qual è il motivo di questo strano comportamento?
Penso in particolare alla frase "Tipo cancellazione associa anche la firma (§8.4.2) di un costruttore o un metodo a una firma che non ha tipi parametrizzati o variabili di tipo." del documento citato significa che tutti i parametri di tipo vengono rimossi da tutti i metodi, indipendentemente se sono collegati ai parametri di tipo della classe o meno. – FrankPl