【问题标题】:How to get instance for dynamic type/dynamically built ParameterizedType in Guice如何在 Guice 中获取动态类型/动态构建的 ParameterizedType 实例
【发布时间】:2013-06-03 17:46:39
【问题描述】:

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

假设您已经进行了以下绑定:

  • List<Apple> 绑定到 ArrayList<Apple>
  • Set<Pears> 绑定到 HashSet<Pear>
  • 等...对于其他CollectionFruit

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

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

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())
    }
}

【问题讨论】:

    标签: java guice


    【解决方案1】:

    好的,我终于找到了解决办法:

    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()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-17
      • 1970-01-01
      相关资源
      最近更新 更多