2012-04-03 61 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