2011-12-18 110 views
2

發現我已經花了大一天試圖理解爲什麼Java可以不編一個簡單的通用方法與泛型類型的參數,但只有當封閉類是進口的。基本上,我露出了Spring上下文操作作爲一類叫做SpringApplicationContext一個靜態方法:泛型方法與類型參數不被Java編譯器

public static <T> List<T> listBeansOfType(Class<T> type) 
{ 
    return new ArrayList<T>(context.getBeansOfType(type).values()); 
} 

當我把它從同一個包裝單元測試,它的工作原理。這裏是測試呼叫:

List<DomainRepo> repos = 
    SpringApplicationContext.listBeansOfType(DomainRepo.class); 

但是,當我從另一個包中的代碼調用它時,完全相同的代碼失敗。編譯器說它找不到符號listBeansOfType(java.lang.Class)。我已經導入了類,但是我沒有對該方法進行靜態導入。

更奇怪的是,這個代碼工作一個星期前,當我寫的。從那時起,我不得不在整個發佈過程中放下一切。當我使用java 1.6編譯maven或Eclipse時發生同樣的錯誤。任何提示都會比歡迎。

+0

這個類是公開的嗎? – 2011-12-18 17:44:01

回答

0

確保您都需要Maven依賴。如果您的Junit測試工作正常,但mvn編譯失敗,則依賴項可以包含在範圍Test中。

<dependency> 
     <groupId>group-a</groupId> 
     <artifactId>artifact-b</artifactId> 
     <version>1.0</version> 
     <scope>TEST</scope> <!-- would explain why you can run your code as junit --> 
    </dependency> 

檢查「上下文」,並且其中所述方法getBeansOfType()被定義的類型。他們可能會因爲mvn依賴而失蹤。

+0

感謝百萬人 - 這確實是一個不正確的依賴,但沒有像這樣簡單。您的評論促使我深入瞭解依賴關係樹,並且還有一個從發佈版本到主開發版本尚未更新。 – GrampaJohn 2011-12-18 21:35:28

+0

恩 - 實際上我說得太快了。有一個過時的依賴關係,會引入SpringApplicationContext的老版本,而沒有問題的方法。但是,修復這種依賴並沒有改變症狀。 – GrampaJohn 2011-12-18 22:03:44

+0

我認爲自從我在〜/ .m2/repository(我之前安裝並刪除它)刪除包含'listBeansOfType()'方法的模塊之後,我一直是Eclipse中某種不良緩存行爲的受害者,並且重建和在Eclipse中多次更新Maven依賴關係,它最終決定玩得很好。沒有其他更改... – GrampaJohn 2011-12-18 22:11:45