[英]Guice generic binding interface to implementation bounded type parameter
我正在使用Google Guice開發依賴於注入的基於JAX-RS的Java應用程序。 我的代碼中包含以下界面:
public interface LockProvider<L extends Lock> {
Optional<L> acquireLock(String lockId);
void releaseLock(L lock);
}
在上面的界面中,Lock是一個定義如下的界面:
public interface Lock {
String getLockId();
}
鎖接口由以下類實現:
public class DynamoDBLock implements Lock {
private final String lockId;
private final LockItem underLyingLock;
public DynamoDBLock(final String lockId, final LockItem underLyingLock) {
this.lockId = lockId;
this.underLyingLock = underLyingLock;
}
@Override
public String getLockId() {
return lockId;
}
public LockItem getUnderlyingLock() {
return underlyingLock;
}
}
LockProvider接口由以下類實現:
public class DynamoDBLockProvider implements LockProvider<DynamoDBLock> {
Optional<DynamoDBLock> acquireLock(String lockId) {
//implementation here
}
void releaseLock(DynamoDBLock lock) {
LockItem underlyingLockItem = lock.getUnderlyingLockItem();
//do something with underlyingLockItem
}
}
我不希望LockProvider之外的應用程序中的類了解underLying鎖定項,這就是為什么我在Lock接口中未包含getUnderlyingLockItem的原因。
現在,當我嘗試將LockProvider綁定到DynamoDBLockProvider時,如下所示:
bind(new TypeLiteral<LockProvider<Lock>>() {}).to(DynamoDBLockProvider.class);
我在Eclipse中收到以下編譯錯誤:
The method to(Class<? extends LockProvider<Lock>>) in the type LinkedBindingBuilder<LockProvider<Lock>> is not applicable for the arguments (Class<DynamoDBLockProvider>)
我了解DynamoDBLockProvider <DynamoDBLock>不是LockProvider <Lock>的子類。 是否有可能完成我想做的事情,即將LockProvider綁定到DynamoDBLockProvider(以一種干凈有效的方式)?
您的DynamoDBLockProvider
實例不是 LockProvider<Lock>
實例。 但是它們是 LockProvider<? extends Lock>
實例LockProvider<? extends Lock>
LockProvider<? extends Lock>
。
一個平行的例子是ArrayList<Integer>
的實例不是 List<Number>
的實例,而是List<? extends Number>
實例List<? extends Number>
根據此問題 List<? extends Number>
。
將其應用於Guice,您將獲得完全相同的編譯失敗。 假設您有一個像這樣的課程:
public class IntegerList extends ArrayList<Integer> {}
然后像這樣綁定它是行不通的:
binder.bind(new TypeLiteral<List<Number>>() {}).to(IntegerList.class); //won't compile
是否有可能完成我想做的事情,即將LockProvider綁定到DynamoDBLockProvider(以一種干凈有效的方式)?
以下綁定將起作用:
binder.bind(new TypeLiteral<LockProvider<? extends Lock>>() {}).to(DynamoDBLockProvider.class);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.