3

インジェクターが与えられた場合、パラメーター化された型の特定のインスタンスを取得する方法を考えています (ただし、Typeそれ自体は持っていません)。私は自分自身を説明しましょう:

次のバインディングを作成したとします。

  • List<Apple>にバインドArrayList<Apple>
  • Set<Pears>にバインドHashSet<Pear>
  • etc... その他Collectionの商品Fruitについて

インスタンスができた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())
    }
}
4

1 に答える 1

5

OK、最終的に解決策を見つけました:

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

キーはTypes.newParameterizedType()、クラスの使用ですcom.google.inject.util.Types

于 2013-06-03T18:20:23.340 に答える