2012-04-03 11 views
6

Wir haben derzeit eine Klasse, die mit openjdk 6. Die folgende Kurz Klasse nicht kompiliert wird diesen Fehler reproduziert:Generics Ausgabe - gefolgert Typ entspricht nicht erklärt gebunden (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); 
    }  
} 

Die Schnittstelle ist einfach es zeigt nur, dass wir nicht die Unterschrift des method2 ändern können:

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

7 es kompiliert mit Orakeln Java-Versionen und openjdk - aber nicht mit openjdk 6, und, leider, das ist die Version, die wir haben um den (ursprünglichen) Code zu kompilieren.

Die Fehlermeldung ist

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); 
          ^

Alles, was ich brauche, sind einige Ideen, wie die Umsetzung des method2 zu ändern, so dass es kompilieren würde. Ich würde über Compiler-Warnungen nicht einmal egal ...

+0

sieht aus wie ein Fehler. Der Eclipse-Compiler und der Sun-Compiler sagen dazu nichts. –

+0

@GuillaumePolet - ein Bug oder eine zu strenge Handhabung von generischen Typen dieser Java-Version. Und, ja, Eclipse beschweren sich nicht (was es ziemlich kompliziert machte, diesen ekligen Fehler zu reproduzieren, der den Build tötet). –

Antwort

10

Ich würde versuchen, die Grenzen explizite Angabe, wie folgt aus:

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

jedoch allgemeiner ich nicht die Notwendigkeit für den Typ-Parameter sehen C überhaupt. Keins von method 's Argumenten oder sein Rückgabetyp verweist überhaupt auf C, also, wenn Sie die Signatur von method ändern können, würde ich nur diesen Typparameter vollständig weglassen.

+0

Ah, tut mir leid, das ist wirklich eine kleine Beispielklasse, die sich einfach auf den Fehler konzentriert. Die * real * -Methoden verwenden alle Typparameter. –

+0

+1 und danke! Klappt wunderbar!! –