2012-04-06 88 views
1

传递类为了更好地理解我的问题返回一个类型类的权Java类型,请参阅以下类:与仿制药

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,新的对象[] {});

返回RepairFetcher,这是因为在调用方法的参数的不那么怪异:

类调​​用

它返回R,其是RepairFetcher.class。

我想 我不想invoke方法返回RepairFetcher类,但我想它返回声明的类型,这是清单< String>终止。

这是可能的,如果是的话,如何实现这一点?

在此先感谢!

回答

2

不知道有问题,但尝试:

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

不错,像魅力一样工作! – NickGreen 2012-04-06 13:12:27

0

RepairFetcher工具Invoker<List<String>>所以RepairFetcher是Invoker<List<String>>和回报是好的。

如果测试:

RepairFetcher的instanceof Invoker<List<String>>,答案必须是真实的。

PS:我更换<通过(因为编辑器与<

+1

我修好了,你需要使用“代码”按钮。 – Puce 2012-04-06 09:32:07

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) { 

,所以你一定能返还相同种类,你调用的回报。