1

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

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,由于调用方法中的参数,这并不奇怪:

类调用者

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

我想要 的我不希望调用方法返回 RepairFetcher 类,但我希望它返回声明的类型,即 List<String>。

这是否可能,如果可以,如何实施?

提前致谢!

4

3 回答 3

2

不确定,但尝试:

public <T, R extends Invoker<T>> T invoke(Class<R> invoker, Object... parameters) {
于 2012-04-06T09:28:48.093 回答
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) {

因此您可以确保返回与调用者返回的类型相同的类型。

于 2012-04-06T09:34:12.440 回答
0

RepairFetcher 实现Invoker<List<String>>所以 RepairFetcher 是一个Invoker<List<String>>并且返回是好的。

如果您对此进行测试:

RepairFetcher instanceof Invoker<List<String>>,答案一定是真的。

PS:我把<换成(因为编辑有问题<

于 2012-04-06T09:24:40.217 回答