11

一般的な抽象テンプレート クラスがあります。タイプ固有の Producer を作成すれば、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);
    }
}

eg a を注入すると、@Inject MyDao<Customer> dao;完全に機能します。しかし、ジェネリックではありません...

4

1 に答える 1

9

ご依頼時

@Inject MyDao<Customer> dao;

コンテナは、具体的にタイプ の Bean が必要であることを認識していますMyDao<Customer>。そのような Bean が存在し、その型情報がわかっている場合、コンテナーは注入を満たすことができます。たとえば、型情報は@Produces注釈付きメソッドに保持されます

@Produces
MyDao<Product> getDaoProduct() {

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

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

ただし、コンテナが知っているのは、MyDao. Tは型変数であり、具体的なパラメーター化ではありません。コンテナーは、特定の型を想定することはできません。あなたの場合、両方の@ProducesBean が一致し、あいまいさが生じます。


あなたの例では、コンテキストから、それが本当にMyDao<Customer>. それはあなたのコンテナができることではないようです。型パラメーターを、パラメーター化されたサブクラスの具体的な型引数に解決しようとしています。

于 2013-10-07T21:13:57.573 に答える