通过使用泛型传递类来返回类型类的Java类型

时间:2012-04-06 09:15:06

标签: java generics

为了更好地理解我的问题,请参阅以下课程:

public interface Invoker<R> {
  public String getName();
  public R getResult();
}

实现:

public class RepairFetcher implements Invoker<List<String>> {

  @Override
  public String getName() {
    return this.getClass().getSimpleName();
  }

  @Override
  public List<String> getResult() {
    return new ArrayList<String>();
  }

}

出错的班级:

public class OperationService {

   public <R> R invoke(Class<R> invoker, Object... parameters) {
     WebserviceOperation<R> operation = new WebserviceOperation<R>(invoker);
     Invoker<R> instance = operation.getInstance();

     return instance.getResult();
   }

}

主要班级:

public class Main {

  public static void main(String[] args) {

    OperationService operationService = new OperationService();
    operationService.invoke(RepairFetcher.class, new Object[] {});

  }

}

问题: 此时方法

  

operationService.invoke(RepairFetcher.class,new Object [] {});

返回一个RepairFetcher,由于invoke方法中的参数,它不是那么奇怪:

  

类调用者

返回R,这是一个RepairFetcher.class。

我想要什么 我不希望invoke方法返回RepairFetcher类,但我希望它返回声明的Type,即List&lt;串GT;

这可能,如果可行,如何实现?

提前致谢!

3 个答案:

答案 0 :(得分:2)

不确定,但请尝试:

public <T, R extends Invoker<T>> T invoke(Class<R> invoker, Object... parameters) {

答案 1 :(得分:1)

您发布的代码不会以当前形状编译(它会遗漏某些部分),但是根据您要执行的操作判断,您应该知道Class参数化了类型类;因此,String.getClass()的类型为Class<String>

那就是你的功能定义

public <R> R invoke(Class<R> invoker, Object... parameters) {

可能应该是

public <R> R invoke(Class<Invoker<R>> invoker, Object... parameters) {

所以你可以确保返回你的调用者返回的相同类型。

答案 2 :(得分:0)

RepairFetcher实现Invoker<List<String>>,因此RepairFetcher为Invoker<List<String>>,返回正常。

如果你测试一下:

RepairFetcher instanceof Invoker<List<String>>,答案必须为真。

PS:我替换&lt; by(因为编辑器有&lt;

的问题