2012-09-05 33 views
1

嘗試調用使用泛型和變參數的重載方法時出現編譯錯誤The method getRecommendedIds(String, Object&Comparable<?>&Serializable[]) is ambiguous for the type MyServiceJava中使用泛型VarArgs的模糊方法調用

服務:

public interface MyService { 
    public <K> List<K> getRecommendedIds(String datasource, K... ids); 
    public <K> List<K> getRecommendedIds(String datasource, int limit, K... ids); 
} 

召喚:

@Test(expected = NullPointerException.class) 
public void testGetWithLimitThrowsNpeForNullDatasource() { 
    service.getRecommendedIds(null, 3, UUID.randomUUID()); 
} 

有沒有解決這個辦法嗎?

回答

3

由於K個變量是無界的呼籲確實是不明確的 - 它可能是三個參數版本的電話,也可能是對(String, K...)版本的調用與autoboxed作爲IntegerK綁定到3 Object。如果您對於K明確的結合稱其爲

service.<UUID>getRecommendedIds(null, 3, UUID.randomUUID()); 

它會工作,因爲無論int也不Integer是分配給UUID類型,因此呼叫必須是三個ARG版本。你也可以逃脫沒有明確的綁定,如果你指定的調用的返回值,限制了類型的變量,即

List<UUID> ids = service.getRecommendedIds(null, 3, UUID.randomUUID()); 

這裏編譯器必須綁定KUUID使返回類型匹配。

+0

謝謝!我嘗試過切換int和String參數,這很有效,但我真的不明白爲什麼!有任何想法嗎? –

+0

因爲它不再含糊不清 - 兩種方法的區別在於它們的第一個參數不是一個類型變量(它可以是「int」或「String」)。 –

+0

啊,是的,通過這個想法很明顯感覺:) –