Ho scoperto i seguenti problemi con i generici. Si consideri la generica interfacciaAccesso agli argomenti dei tipi generici utilizzati nelle barre dei tipi
public interface A<X> {
X get();
void doStuff(X x);
}
Ora, supponiamo che la seguente definizione del metodo:
public <T extends A<?>> void foo(T t) {
bar(t);
}
A causa del carattere jolly, le informazioni sul tipo per il tipo di ritorno di get() è insufficiente. Pertanto, ho delegare ad un altro metodo che "lega" questo jolly per un tipo di variabile fresco:
private <X> void bar(A<X> t) {
X x = t.get();
t.doStuff(x);
}
L'invocazione del bar() in foo non è permesso, il compilatore emette il seguente messaggio di errore:
la barra metodo (a) nella prova di tipo non è applicabile per l'argomenti (T)
Tuttavia, se cambio il metodo foo() per
public <T extends A<?>> void foo(T t) {
A<?> u = t; // No explicit cast required, no "unchecked" warning!
bar(u);
}
funziona. Perché? È un errore del compilatore? Qualsiasi commento su questo sarebbe molto apprezzato.
Note:
- Il motivo per cui io non semplicemente dichiaro metodo foo come void foo (A) è che sto in realtà utilizzando il tipo superiore interesection legato (&).
- Il motivo per cui non dichiaro X come variabile di tipo in foo() è che effettivamente ho il problema a livello di classe e non voglio aumentare inutilmente il numero di parametri di tipo di questa classe.
stai usando il flag del compilatore -Xlint? In caso contrario, prova a compilarlo con quello –
Non cambia nulla .. – misberner
Sono d'accordo con @kan. Il compilatore java, in effetti, lo compila. Ho usato 1.6.0_27. Eclipse ti dà l'errore esatto che hai dato, quindi forse lo stai usando? –