混淆使用java泛型的正确方法

时间:2012-09-30 10:54:42

标签: java

我已经触及了一点,我不确定如何继续前进。我有一个包含以下代码的课程

public class MyClass{

  private Class<? extends ValidationProvider> providerClass;
  //getter ans setter

}

提供程序类在运行时传递,并且可以有不同的实现,只需遵循上述合同? extends ValidationProvider

在我的实现中,我提供了一个属性,用户可以在其中传递提供者名称类,并根据我需要继续前进。为了继续前进,我需要使用内置依赖注入机制来获取提供者类的实例像

 public class MyClass{

      private Class<? extends ValidationProvider> providerClass;
      //getter ans setter

      public void setProvider(){
         providerClass=container.getInstance("type","name");
      }
    }

container.getInstance("type","name");的签名

 <T> T getInstance(Class<T> type, String name);

我不知道如何将类型传递给容器并获取提供者类的实例(因为提供者类具有签名<? extends ValidationProvider>)。

对于简单的用例,我可以这样做

container.getInstance(String.class,"my constant");

但不知道如何为我的用例做这件事 在这方面的任何帮助将非常感激。

1 个答案:

答案 0 :(得分:0)

让我们退一步......您的要求是MyClass应该可以使用ValidationProvider的不同实现进行配置,我假设您的语法是超类。我不认为你需要MyClass中的泛型来实现这个目标:

public class MyClass{

    private ValidationProvider provider;

    public void setProvider(ValidationProvider _provider){
        this.provider = _provider;
    }
}

然后,如果(例如)配置是通过在配置文件中具有确切提供程序实现的完全限定名称来实现的,则可以按如下方式设置MyClass的实例:

...
String validatorClassName;
...
// Assign validatorClassName a value from a config file
...
ValidationProvider v = container.getInstance(Class.forName(validatorClassName), "blah");
myClass.setProvider(v);