2012-04-03 13 views
6

momento abbiamo una classe che non compilare con openjdk 6. Il seguente classe abbreviato riproduce questo errore:Generics problema - dedurre tipo non conforme alla dichiarata vincolato (s)

public class Copy implements ICopy {   
    public <A,B extends List<A>,C extends Map<A,B>> A method(A a, B b) { 
     A something = null; 
     return something; 
    } 

    @Override 
    public <A,B extends List<A>> A method2(A a, B b) { 
     return method(a,b); 
    }  
} 

L'interfaccia è semplice ma mostrano solamente, che non possiamo cambiare la firma del method2:

public interface ICopy {  
    public <A,B extends List<A>> A method2(A a, B b); 
} 

compila con le versioni oracoli Java e OpenJDK 7 - ma fallisce con OpenJDK 6, e, purtroppo, questa è la versione che abbiamo da usare per compilare il codice (originale).

Il messaggio di errore è

Copy.java:15: invalid inferred types for C; inferred type does not conform to declared bound(s) 
inferred: java.util.Map<A,B> 
bound(s): java.util.Map<A,B> 
       return method(a,b); 
          ^

Tutto quello che serve sono alcune idee su come modificare l'implementazione di method2 in modo che fosse la compilazione. Non avrei nemmeno preoccuparsi di avvisi del compilatore ...

+0

sembra un insetto. Il compilatore di Eclipse e il compilatore di Sun non dicono nulla al riguardo. –

+0

@GuillaumePolet - un bug o una gestione eccessivamente rigida di tipi generici di quella versione java. E, sì, eclipse non si lamenta (il che ha reso piuttosto complicato riprodurre questo brutto errore che uccide la build). –

risposta

10

vorrei provare a specificare i limiti in modo esplicito, in questo modo:

return this.<A,B,Map<A,B>>method(a,b); 

Tuttavia, più in generale, non vedo la necessità per il parametro tipo C affatto. Nessuno degli argomenti di method o il suo tipo restituito fa riferimento a C, quindi se è possibile modificare la firma di method, vorrei semplicemente omettere quel parametro di tipo interamente.

+0

Ah, mi dispiace, questa è davvero una piccola classe di esempio che si focalizza semplicemente sull'errore. I metodi * real * usano tutti i parametri di tipo. –

+0

+1 e grazie! Funziona come un fascino !! –

Problemi correlati