sto leggendo attraverso la seguente sezione nel tutorial Java: http://docs.oracle.com/javase/tutorial/java/generics/capture.htmlJava Generics jolly vs utilizzo tipizzati Generics
Si inizia dicendo che il seguente codice genera un errore a causa del fatto che una cattura non può essere convertito in un oggetto in modo che il metodo di set
non può confermare che oggetto è di tipo capture # 1:
import java.util.List;
public class WildcardError {
void foo(List<?> i) {
i.set(0, i.get(0));
}
}
ho po capire il ragionamento alla base di questo. i.get restituisce un oggetto e il compilatore non può determinare se l'oggetto è di tipo capture n. 1 in modo che non possa corrispondere al secondo argomento in modo typesafe.
E poi consiglia di utilizzare il seguente codice per rendere questo metodo di lavoro:
public class WildcardFixed {
void foo(List<?> i) {
fooHelper(i);
}
// Helper method created so that the wildcard can be captured
// through type inference.
private <T> void fooHelper(List<T> l) {
l.set(0, l.get(0));
}
}
ho po capire perché questo codice funziona così, in questo codice, l.get
è garantito per essere di tipo T, in modo da esso può essere passato come argomento di tipo T.
Quello che non capisco è il motivo per cui non si potrebbe utilizzare un metodo come questo, senza alcun aiuto:
class GenericsTest {
static <K> void bar(List<K> l) {
l.set(0, l.get(l.size() - 1));
}
public static void main(String[] args) {
List<Integer> lst = Arrays.asList(1, 2, 3, 4);
bar(lst);
System.out.println(lst); // [4, 3, 2, 4]
}
}
Ad esempio, se si intende utilizzare l'inferenza di tipo, perché non utilizzare solo generici espliciti digitati su un jolly e una funzione di supporto? C'è qualche vantaggio nell'usare i caratteri jolly in questo scenario? In quali casi preferiresti effettivamente utilizzare un carattere jolly su un generico digitato?
Cosa significa "statico vuoto", secondo voi? –
@Mike Per me, significa che K è un parametro di tipo che si applica solo all'ambito del metodo. Java usa l'inferenza di tipo per capire cosa K dovrebbe essere in fase di runtime. Nell'esempio mostrato, passo in un'istanza di List così il compilatore deduce K come intero. K può essere qualsiasi tipo di riferimento e i tipi di riferimento si estendono da Object, quindi considero K come un altro modo di scrivere esplicitamente in questo caso >. –
Shashank
@Mike non lo so ... sembra essere lo stesso di un normale metodo vuoto. Non sapevo che K avesse qualcosa a che fare con il ritorno. Sto solo usando la sintassi da qui: http://docs.oracle.com/javase/tutorial/java/generics/methods.html – Shashank