簡體   English   中英

如何綁定通用類?

[英]How do I bind a Generic class?

當我嘗試使用Jukito模擬Dao時,出現以下異常:

java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
    at org.jukito.JukitoModule.addKeyDependency(JukitoModule.java:338)
    at org.jukito.JukitoModule.addInjectionPointDependencies(JukitoModule.java:330)
    at org.jukito.JukitoModule.addDependencies(JukitoModule.java:313)

我嘗試模擬的對象是ConcreteDao

public class ConcreteDao extends AbstractDao<MyDomain> {
}

public abstract class AbstractDao<T extends DatastoreObject> {
}

我在SO上閱讀了幾篇有關此綁定泛型的文章,但我想不出一種使用TypeLiteral進行綁定的方法。

這是我嘗試的:

bind(new TypeLiteral<AbstractDao<MyDomain>>(){}).to(ConcreteDao.class);

您需要這樣綁定:

bind(new TypeLiteral<AbstractDao<MyDomain>>(){}).to(new TypeLiteral<ConcreteDao<MyDomain>>(){});

這是檢索通用類的方法:

class AbstractDao {
  protected final Class<T> clazz;

  @Inject
  public AbstractDao(TypeLiteral<T> type) {
    clazz = (Class<T>) type.getRawType();
  }
}

AbstractDao子類將需要將特定於實體的TypeLiteral傳遞給父類( AbstractDao ):

class ConcreteDao extends AbstractDao<MyDomain> {
  @Inject
  public ConcreteDao(TypeLiteral<MyDomain> type) {
    super(type);
  }
}

請注意,可以使AbstractDao類成為非抽象類並實現基本的CRUD操作,以便可以使用它而無需為每個實體擴展AbstractDao 您只需要為每個實體綁定,如下所示:

bind(new TypeLiteral<GenericDao<User>>(){}).in(Scopes.SINGLETON);

有關更多信息,請參見我的博客文章

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM