2013-08-09 13 views
5

ho qualcosa sulla falsariga di:"token imprevisto" utilizzando jolly inferiore delimitata (Java)

interface Foo<T> { 
    //... lines [0,45]... 

/*line 46*/ <R, X super T&R> List<X> weave(R value); 
    //... 
} 

Ma IntelliJ sta segnalando:

  1. Errore: (46, 18) Java: > atteso
  2. Errore: (46, 19) Java: inizio illegale di tipo
  3. Errore: (46, 26) java: '(' previsto
  4. Errore: (46, 28) Java: 0.123.870,395428 millionsidentificatore> previsto
  5. Errore: (46, 29) Java: 'l' atteso
  6. Errore: (46, 43) Java: < identificatore> previsto

Qual è il problema? Non mi è permesso legare un nome ad un limite inferiore? Oppure sono autorizzato a utilizzare un'espressione R&X in un limite superiore?

Cambiare a

interface Foo<T> { 
    //... lines [0,45]... 

/*line 46*/ <R> List<? super T&R> weave(R value); 
    //... 
} 

cede

  1. errore (46, 31) Java:> previsto
  2. errore (46, 32) java: '(' previsto
  3. errore (46, 33) java: inizio illegale di tipo
+0

@rgettman FYI la risposta è stata corretta. I downvoter e le persone che hanno giustificato il downvote stavano confondendo i caratteri jolly con i parametri di tipo. "Non puoi dichiarare una variabile di tipo super": http://stackoverflow.com/questions/2800369/bounding-generics-with-super-keyword "non puoi dichiarare due limiti che sono di per sé parametri di tipo generico" : http://stackoverflow.com/questions/13101991/java-generics-make-generic-to-extends-2-interfaces –

risposta

3

Dal mio la lettura della specifica, super può essere utilizzata solo con un carattere jolly e non può essere acquisita in una variabile di tipo; vedi JLS 4.5.1. Allo stesso modo, & è valido solo nelle variabili di tipo , non nel tipo argomenti e le variabili di tipo non possono utilizzare super.

Dopo averci pensato, ecco la mia spiegazione: il motivo di una variabile di tipo è eliminare la trasmissione esplicita per migliorare la sicurezza del tipo. Quando si dichiara un parametro di tipo ad essere super Foo, stai dicendo che va bene per quel parametro di essere eventuali superclasse di Foo. Ciò significa che potrebbe essere qualsiasi cosa fino a Object, e quindi non si ha modo sicuro di presumere qualcosa sugli oggetti il ​​cui tipo soddisfa tale limite, e quindi non ci sono informazioni di alcun genere contenute in una variabile di tipo denominata; è solo jolly e può chiamare hashCode() o toString(), ma nulla di specifico tipo.

+0

Riesci a pensare a un modo per specificare la semantica che sto cercando? –

+0

Puoi spiegare la semantica? O :-) Non è facile dedurre dal tuo codice. Che cosa dovrebbe fare l'interfaccia Foo? Che dire di 'tessere'? Cosa intendi usando 'super' in un tipo di ritorno? – chrylis

+0

Foo è solo una collezione di T. "tessere" è una generalizzazione del pattern che si usa comunemente per stampare gli elementi di un array: [1, 2, 3].weave (",") restituisce [1, ",", 2, ",", 3,]. In altre parole, restituisce "questo", tranne che con il parametro giuntato tra ciascun elemento. Per quanto riguarda la semantica dei generici, voglio restituire una lista del supertipo più derivato comune a R e T, anche se non sono sicuro che esista un meccanismo del genere. Voglio farlo in modo che la lista restituita sia parametrizzata in qualche modo (e non solo una lista grezza) se possibile, per la sicurezza del tipo. –

Problemi correlati