簡體   English   中英

Guice通用綁定接口到實現的有界類型參數

[英]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.

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