2013-10-07 7 views
5

私は一般的な抽象テンプレートクラスを持っています。私は型固有のプロデューサを作成すると、ジェネリッククラスに直接DAOサービスを注入できると思っていました。しかし、私はできません。ジェネリッククラスを挿入できないのはなぜですか?

なぜですか?そして、どうすればこの問題を回避できますか?

abstract class MyView<T> { 
    @Inject 
    MyDao<T> dao; 

    //some more template methods that make use of the dao 
    void someMethod() { 
     dao.use(); 
    } 
} 

class CustomerView extends MyView<Customer> { 
    //javax.enterprise.inject.AmbiguousResolutionException: Ambigious resolution 
} 


class DaoManager { 
    @Produces 
    MyDao<Customer> getDaoCustomer() { 
     return DaoFactory.make(Customer.class); 
    } 

    @Produces 
    MyDao<Product> getDaoProduct() { 
     return DaoFactory.make(Product.class); 
    } 
} 

たとえば、@Inject MyDao<Customer> dao;と入力すると、完全に機能します。あなたは

@Inject MyDao<Customer> dao; 

を要求する場合でも、ジェネリック医薬品と...

+0

あなたの 'DaoFactory'はどのように実装されていますか? –

+1

"does not work"を定義してください。また、 '@Inject MyDao dao;はどのように一般的ではありませんか? –

+0

動作しません。手段は例外をスローします。もちろん、MyDao はある程度一般的です。それでも抽象メソッドに完全な汎用doaを注入したいと思います。カスタマイズされたものではありません。 – membersound

答えて

6

コンテナを使用すると、特にタイプMyDao<Customer>の豆を望んでいることを知っていません。そのようなBeanが存在し、その型情報がわかっている場合、コンテナは注入を満たすことができます。例えば、タイプ情報が

@Produces 
MyDao<Product> getDaoProduct() { 

コンテナはそのパラメータ化された型を取得するためにリフレクションを使用し、要求された@Injectフィールドにそれを一致させることができ、あなたの@Produces注釈付きの方法で保存されています。

abstract class MyView<T> { 
    @Inject 
    MyDao<T> dao; 

しかし、すべてのコンテナは、あなたがMyDaoをしたいということであることを知っています。 Tは型変数であり、具体的なパラメータ化ではありません。コンテナは特定の型を取ることはできません。あなたのケースでは、@Produces豆の両方が一致し、あいまいさがあります。


この例では、実際にはMyDao<Customer>が必要であることがわかりました。それはあなたのコンテナが行うことができるものではないようです。 typeパラメータを、パラメータ化されたサブクラスの具体的な型引数に解決しようとしています。

+0

@mrts私は自分の質問を誤解していたと思うので、私は自分の答えを編集しました。しかし、私はあなたのコメントが彼らが求めている状況を表すとは思わない。注入しようとしているフィールドのタイプは 'Foo 'です。コンテナは、サブクラスの型を「顧客」に解決する必要があります。それはそうではないように見えます。 –

関連する問題