2011-12-18 12 views
2

Javaがジェネリック型の引数を使用して単純な汎用メソッドをコンパイルできない理由を理解しようと、ほとんどの時間を費やしましたが、基本的に、私はSpringApplicationContextと呼ばれるクラスの静的メソッドとしてSpringコンテキスト操作を暴露しています:私は、同じパッケージ内のユニットテストから、それを呼び出すと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

このクラスは公開されていますか? –

答えて

0

必要なすべての依存関係があることを確認してください。あなたの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

+0

um - 実際、私はあまりにも早く話しました。 SpringApplicationContextの古いバージョンを問題のメソッドなしで持ってきた古い依存性がありました。しかし、その依存関係を修正しても、症状はまったく変わりませんでした。 – GrampaJohn

+0

〜/ .m2/repositoryからlistBeansOfType()メソッドを含むモジュールを削除してから(以前にインストールして削除していた)Eclipseの悪いキャッシング動作の犠牲者であったと思います。 EclipseでMaven依存関係を何度か更新すると、最終的に素敵なプレイをすることにしました。その他の変更はありません... – GrampaJohn

関連する問題