Sto utilizzando Android Studio 1.1.0.Avviso di assegnazione deselezionata
Questo fa sì che nessun avvertimento:
public static class A {
public Map<Integer, String> getMap() {
return null;
}
}
public static class B {
public void processA(A a) {
Map<Integer, String> map = a.getMap();
}
}
Ma fare A
generico:
public static class A<T> {
public Map<Integer, String> getMap() {
return null;
}
}
E questa linea:
Map<Integer, String> map = a.getMap();
si ottiene un avvertimento ora: "Unchecked assignment: 'java.util.Map to java.util.Map<java.lang.Integer, java.lang.String>'
.
Anche se la firma di getMap
è totalmente indipendente da T
e il codice non è ambiguo per quanto riguarda i tipi che contiene lo Map
.
So che posso liberarmi di avvertimento da reimplementare processA
come segue:
public <T> void processA(A<T> a) {
Map<Integer, String> map = a.getMap();
}
Ma perché avrei dovuto farlo? Che cosa importa qui lo T
?
Quindi, la domanda è - perché non digitare la cancellazione deve interessare non solo T
(che è comprensibile - se sto passando un'istanza di A
, T
è uno sconosciuto), ma anche "hardcoded" firma generico come <Integer, String>
in questo caso?
'Non potrebbe utilizzare tutto ciò che riguarda il tipo di A ma hey il compilatore non conosce questo fatto - beh, * potrebbe * conoscerlo abbastanza facilmente, basta dare un'occhiata all'implementazione di 'processA', non è difficile verificare che' T' sia irrilevante;) Vado con '>' come suggerisci, ma sono deluso dal compilatore. –
@KonradMorawski In un mondo ideale, solo "A" dovrebbe essere illegale e il codice non dovrebbe essere compilato. Ma è consentito per motivi di compatibilità con le versioni precedenti. Per una classe dichiarata come 'A', il suo tipo generico è estremamente importante per fare qualsiasi cosa relativa a 'A'. Quindi non è permesso usare solo 'A' (infatti in Scala, è illegale usare solo' A') –
Jatin
Sì, immagino ... Non uso Scala, ma vengo dal lato C# del il mondo e i generici di Java sembrano scarpe troppo piccole. –