Java 如何在GUI中获取动态类型/动态构建的参数化类型的实例

Java 如何在GUI中获取动态类型/动态构建的参数化类型的实例,java,guice,Java,Guice,给定一个注入器,我想知道如何检索某个参数化类型的特定实例(但我没有类型本身)。让我解释一下: 假设您进行了以下绑定: 列表绑定到数组列表 Set绑定到HashSet 等等。。。对于水果的其他集合 现在我有了一个水果实例,我想检索相应的集合实例。我怎样才能做到这一点 下面是一个小的工作片段,用代码说明了我的所有解释: import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; impor

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

假设您进行了以下绑定:

  • 列表
    绑定到
    数组列表
  • Set
    绑定到
    HashSet
  • 等等。。。对于
    水果的其他
    集合
现在我有了一个
水果
实例,我想检索相应的
集合
实例。我怎样才能做到这一点

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

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())
    }
}
import java.util.ArrayList;
导入java.util.Collection;
导入java.util.HashSet;
导入com.google.inject.AbstractModule;
导入com.google.inject.Guice;
导入com.google.inject.Injector;
导入com.google.inject.Key;
导入com.google.inject.TypeLiteral;
公共类TestGuiceDynamicType{
公共静态接口{
}
公共静态类Apple实现水果{
}
公共静态类Pear实现水果{
}
公共静态类模块扩展了AbstractModule{
@凌驾
受保护的void configure(){
绑定(新的TypeLiteral(){
}).to(新的TypeLiteral(){
});
绑定(新的TypeLiteral(){
}).to(新的TypeLiteral(){
});
}
}
专用静态真空进样器(进样器、T型进样器){
Collection Collection=???//在这里如何获得适当的集合
收集。添加(水果);
}
公共静态void main(字符串[]args){
Injector=Guice.createInjector(新模块());
集合appleCollection=injector.getInstance(Key.get(new-TypeLiteral()){
}));
add(newapple());
添加水果(注射器,新梨())
}
}

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

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);
}
private static void addFruit(注入器注入器,T-fruit){
Collection Collection=(Collection)injector.getInstance(Key.get)(Types.newParameterizedType)(Collection.class,
fruit.getClass());
收集。添加(水果);
}
关键是使用类
com.google.inject.util.Types
Types.newParameterizedType()