2013-04-05 87 views
3

我試圖從java1.6遺留代碼庫遷移到1.7,我收到以下錯誤而編譯:JDK7編譯錯誤:歧義參考

reference to create is ambiguous, both method create(long,Object...) in Meta and method create(Object...) in Meta match

這裏是元類的名稱。只有在使用JDK1.7進行編譯時纔會看到此錯誤。在1.6版本中,它構建得很好,所有的依賴也都很好。

兩個多態函數如下:

create(long id, Object... paramters) { 
    .... 
} 

create(Object... paramters) { 
    .... 
} 

如何解決這使代碼同時適用於1.6編譯和1.7編譯。

編輯:添加呼叫實例被拋出一個錯誤:

Id.create(1234); 
Id.create(id); // id is a long value 
+1

你的問題是什麼? – 2013-04-05 09:39:26

+1

它肯定會有助於查看自包含的示例(源代碼),或者至少會導致錯誤的調用/引用......? – TheBlastOne 2013-04-05 09:40:46

+0

根據您的意見編輯問題 – 2013-04-10 07:32:47

回答

4

這是由固定在Java 7編譯器造成的:

Incompatibilities between JDK 7 and JDK 6

Area: Tools

Synopsis: Changes in Most Specific Varargs Method Selection

Description: The overload resolution algorithm in the javac compiler has been fixed in how it selects the most specific varargs method when more than one method is applicable to a given call-site (see the JLS, Java SE 7 Edition, section 15.12.2.5).

...

While the javac compiler accepts more code than it did prior to JDK 7, this fix also results in a slight source incompatibility in the following case:

class Test { 
    void foo(int... i) {} 
    void foo(Object... o) {} 

    void test() { 
     foo(1,2,3); 
    } 
} 

This code compiles in JDK 6 (the most specific method is foo(int...)). This code does not compile under JDK 7.


爲了使代碼工作在這兩個版本的JDK,你需要給編譯器的額外提示選擇合適的方法,例如像

Id.create(1234, new Object[0]); 
Id.create(id, new Object[0]); 

這將調用create(long id, Object... parameters)兩個JDK6和JDK7,和將爲可變參數部分傳遞一個大小爲0的數組,該數組在使用原始代碼時也在Java 6中傳遞。儘管如此,這看起來有點不可思議,我可能會選擇(爲了更好的可讀性),將重命名爲之一的方法,以便方法調用不依賴簽名。

您還應該考慮Java6處於其生命週期結束時期,因此可能另一種選擇是修改代碼,以便首先編譯Java7。

+0

是否有任何方法我可以使代碼工作的兩個JDK – 2013-04-10 07:32:28

+0

有很多選項,請參閱我的更新回答 – 2013-04-10 08:39:27

+0

同意最好的方法是重命名... – Thihara 2013-04-10 09:51:12

0

長包裹在長時成爲一個對象。

那麼編譯器如何知道調用哪個方法?

對於編譯器來說,由於自動裝箱,兩種方法都匹配方法調用。

如果你爲編譯器調用create(12)它不可能決定一個方法。因爲當long被自動裝入Long時,它將匹配兩個方法。

+1

右鍵 - 有趣的是,java 6編譯器選擇create(long id,Object ...參數)' – 2013-04-05 09:53:19

+0

我以爲它在一切實際上是一樣的....感謝您的更正.. – Thihara 2013-04-05 10:26:44

+0

所以如何使代碼工作的兩個JDKs – 2013-04-10 07:31:57