当前位置: 首页 > 知识库问答 >
问题:

到实现有界类型参数的Guice泛型绑定接口

孙福
2023-03-14

我正在开发一个基于JAX-RS的Java应用程序,使用Google Guice进行依赖注入。我的代码中有以下接口:

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之外,我不希望应用程序中的类知道底层锁项,这就是为什么我没有在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 不是LockProvider 的子类。是否有可能完成我正在尝试做的事情,即将LockProvider绑定到DynamoDBLockProvider(以干净高效的方式)?

共有1个答案

柯波峻
2023-03-14

您的DynamodBlockProvider实例不是LockProvider 的实例。但它们是lockprovider<?扩展锁>

一个并行示例是arraylist 的实例不是list 的实例,而是list<的实例?根据此问题扩展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);
 类似资料:
  • 可以自动绑定泛型类吗?考虑一下: 通用接口: 长子类型: 字符串子类型: 自定义模块:公共类CustomModule扩展AbstractModule{ } 主要的 是否可以以某种方式(例如:基抽象类、反射或其他)自动绑定

  • 在了解Java泛型的过程中,我遇到了以下问题: 假设我有下面的方法来添加列表的元素,只限于包含数字的列表。 但是这段代码和这段代码有什么不同: 它们都按预期编译和执行。这两者之间有什么区别?除了语法之外?什么时候我更喜欢使用通配符而不是前者? 是的,使用通配符方法,我不能在列表中添加除null之外的新元素,否则它将无法编译。除此之外呢?

  • 问题内容: 是否有将通用类型参数约束为 任何 类型范围的语法或解决方法? 我知道您可以将一个类型限制为 所有 类型的范围(即逻辑): 是否有逻辑版本,例如: 如果没有支持该语法的语法(我认为不存在),是否有一种好的方法或方法? 在某些情况下,一个示例用例可能是: 人们似乎迷上了上面我的方法示例的确切语义。让我们尝试一下: 编辑: 我不会在编译时知道(可能来自外部代码),所以我想避免每种类型都有具体

  • 我正面临以下问题: “链”来自ViewModelHelper类定义 2) 2.1),->可以用替换 如果我将2.1)应用于1.1)&1.2),我们可以看到,参数T是一致的 从1)遵循从2)遵循,从2.1)遵循可以被替换,如果我正确理解,这个错误应该不会出现,有人能解释一下吗?为什么eclipse会给我这个错误? 谢谢!

  • 使用Guice 3.0,我尝试注入一个提供程序,该提供程序可以抛出特定的已检查异常。所以我使用了抛出提供者扩展。 我为提供者创建了一个接口: 及其实施: 我在要注入提供者的对象上使用@Inject注释: 现在,我的问题是:如何绑定这个提供者? 由于使用了泛型,我想到了使用TypeLiteral: 但是对于这个bind()方法来说,