2012-04-03 29 views
6

目前我们有一个类,不会的OpenJDK 6编译下面缩短类重现此错误:泛型问题 - 推断类型不符合申报的约束(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); 
    }  
} 

界面简单,它只是表明,我们不能改变method2的签名:

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

它编译与神谕的Java版本和OpenJDK 7的 - 但失败了OpenJDK 6,和,不幸的是,这是我们拥有的版本用来编译(原始)代码。

的错误消息是

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

所有我需要的是一些想法如何改变method2实施,以便它编译。我甚至不会在意编译器警告......

+0

看起来像一个错误。 Eclipse编译器和Sun的编译器对此没有任何说明。 – 2012-04-03 15:54:30

+0

@GuillaumePolet - 对该Java版本的泛型类型的错误或过于严格的处理。而且,是的,日食不会抱怨(这使得再现这个令人讨厌的错误造成构建非常复杂)。 – 2012-04-03 16:04:02

回答

10

我会尝试明确指定范围,就像这样:

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

然而,更普遍的,我没有看到该类型参数的需要C。没有method的参数或其返回类型引用C根本没有,所以如果您可以更改method的签名,我只会完全省略该类型参数。

+0

啊,对不起,这实在是一个小样本课,只关注错误。 * real *方法使用所有类型参数。 – 2012-04-03 19:04:43

+0

+1,谢谢!奇迹般有效!! – 2012-04-03 19:05:43