2011-02-02 19 views
2

私はCacheListener<T>CacheListenerLoaderを実装しており、CacheListener<Activity>を実装しています。一般的な工場のJava汎用はコンパイルされていません

私はProvider<CacheListenerLoader> Guiceを持っているので、タイプはCacheListenerLoaderでなければならないので、Googleは正しいものを生成します。

4行はコンパイルされません:私は、このメソッドを呼び出ししようとしていますので、重要である

CacheListenerLoader listTemp; 
OurCacheListener<Activity> t2 = listTemp; 
Provider<CacheListenerLoader> prov; 
Provider<OurCacheListener<Activity>> temp = prov; 

は:

private <T> void put(Class<T> klass, Provider<OurCacheListener<T>> provider) 

が、私は「するようにプロバイダとクラス型の正しい組み合わせを渡しますコンパイル時に保証されているクラス型のルックアップは、与えられたクラスを処理できる何かをもたらします。

私はActivity.classとtempをputメソッドに渡します。これはうまく動作し、型をチェックします。キーは、上記の4行目は、ジェネリックスが私にここで失敗しているように見えますが、コンパイル時のものである理由はわかりません。

+3

この 'OurCacheListener'タイプはどこに入りますか?あなたは単に 'CacheListener'を言及し、' CacheListenerLoader'は 'CacheListener'を実装します。 – ColinD

答えて

6

私はCacheListenerが正しいタイプであると仮定し、あなたのputメソッドにあなたのProvider<CacheListenerLoader>メソッドを渡します。

ここでの問題は、Provider<CacheListenerLoader>が、汎用の世界でProvider<CacheListener<Activity>>のサブタイプではないことです。これは、List<Number>タイプにList<Integer>を割り当てることができないのと同じです。これを実行した場合、DoubleList<Number>に追加してからから取得しようとすると、Integer a ClassCastException

もちろん、プロバイダに何も追加できないため、これは問題ではありません。しかし、あなたはまだ型システムにそれを伝えなければなりません!これは、あなただけCacheListener<T>ものを返すことができますし、任意のメソッドを呼び出すことができるようにする必要がないこと、プロバイダーをしたいと言っている

private <T> void put(Class<T> clazz, 
        Provider<? extends CacheListener<T>> provider) 

:何をする必要があるとputの署名を変更でCacheListener<T>を消費しようとします。

0

あなたはジェネリックスの制限を遭遇しましたイオン:プロバイダーとプロバイダーは、AがBを拡張または実装していても互換性がありません。

関連する問題