gpt4 book ai didi

java - 如何在 Guice 中获取动态类型/动态构建的 ParameterizedType 的实例

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:49:49 24 4
gpt4 key购买 nike

给定一个注入(inject)器,我想知道如何检索某个参数化类型的特定实例(但我没有 Type 本身)。让我解释一下:

假设您进行了以下绑定(bind):

  • List<Apple>绑定(bind)到 ArrayList<Apple>
  • Set<Pears>绑定(bind)到 HashSet<Pear>
  • 等...其他CollectionFruit .

现在我有一个 Fruit fruit实例,我想检索适当的 Collection实例。我怎样才能做到这一点?

这是一个小的工作片段,用代码说明了我所有的解释:

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;

import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Key;
import com.google.inject.TypeLiteral;

public class TestGuiceDynamicType {
public static interface Fruit {

}

public static class Apple implements Fruit {

}

public static class Pear implements Fruit {

}

public static class FruitModule extends AbstractModule {
@Override
protected void configure() {
bind(new TypeLiteral<Collection<Apple>>() {

}).to(new TypeLiteral<ArrayList<Apple>>() {
});
bind(new TypeLiteral<Collection<Pear>>() {

}).to(new TypeLiteral<HashSet<Pear>>() {
});

}
}


private <T extends Fruit> static void addFruit(Injector injector, T fruit) {
Collection<T> collection = ????? // What to do here to get the appropriate collection
collection.add(fruit);
}

public static void main(String[] args) {
Injector injector = Guice.createInjector(new FruitModule());
Collection<Apple> appleCollection = injector.getInstance(Key.get(new TypeLiteral<Collection<Apple>>() {

}));
appleCollection.add(new Apple());
addFruit(injector, new Pear())
}
}

最佳答案

好的,我最终找到了解决方案:

private static <T extends Fruit> void addFruit(Injector injector, T fruit) {
Collection<T> collection = (Collection<T>) injector.getInstance(Key.get(Types.newParameterizedType(Collection.class,
fruit.getClass())));
collection.add(fruit);
}

关键是使用 com.google.inject.util.Types 类的 Types.newParameterizedType()

关于java - 如何在 Guice 中获取动态类型/动态构建的 ParameterizedType 的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16902707/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com