3

我有一个由类实现的通用接口,我想以通用方法返回。界面:

public interface IWorker<T extends Object, K extends Object> {  
public K doWork(T o);
}

执行:

public class WorkerImpl implements IWorker<String, List<Serializable>>
{
   @Override
   public List<Serializable> doWork(String s)
   {
       return ...
   }
}

返回实现的泛型方法的 ActionCoordinator 接口:

public interface IActionCoordinator
{
    public <T extends Serializable, K extends Serializable> IWorker<T, K> getAction(T  request);
}

ActionCoordinator 实现:

public class ActionCoordinatorImpl implements IActionCoordinator
{
    @Override
    public <T extends Serializable, K extends Serializable> IWorker<T, K> getAction(final T requ)
    {
        return (IWorker<T,K>)new WorkerImpl();
    }
}

问题: 在 Eclipse 中这将起作用,但是使用 JDK 1.6.0_35 进行 maven 构建不会并说“不可转换类型”。我可以解决这个问题:

public class ActionCoordinatorImpl implements IActionCoordinator
{
    @Override
     public <T extends Serializable, K extends Serializable> IWorker<T, K> getAction(final T requ)
    {
        Object temp = new WorkerImpl();
        return (IWorker<T,K>)temp;
    }
}

但它不应该是,那根本不是类型安全的。

一些想法会很好。提前致谢...

编辑:现在对我有用的是: 我将所有通用 Ts 和 Ks 更改为可序列化。这就是我需要限制 WorkerImpl 的全部内容。实际的调用者仍然需要一个IWorker<T,K>IWorker<Serializable,Serializable>适合并且可以工作...谢谢大家,但我仍然想知道为什么 eclipse 什么也没说...

4

3 回答 3

2

问题不在于 maven不会编译,而是 Eclipse 没有抱怨不安全的演员阵容:您可能在 Eclipse 首选项中关闭了一个选项,并且正在 maven 中进行严格的编译。

WorkerImpl不适合从你的工厂方法返回ActionCoordinatorImpl,因为不能保证Serializable传递给它的doWork()方法将是 a String- 它必须是 any Serializable


此外,您可以通过更改IWorker

public interface IWorker<T extends Object, K extends Object>

public interface IWorker<T, K>

因为它们是等价的(一切都扩展了对象)

于 2012-09-20T13:38:14.850 回答
0

new WorkerImpl()产量IWorker<String, List<Serializable>>,你打算如何将其转换为 IWorker<T,K>?您认为编译器应该在哪里获取类型K?你会在调用时总是明确地传递它getAction吗?然后你也必须传递类型T,但它也是由参数设置的requ,调用看起来很丑陋。

于 2012-09-20T13:53:46.273 回答
0

WorkerImpl唯一的工具IWorker<String, List<Serializable>>。然后,您尝试将其设置为不正确IWorker<T extends Serializable, K extends Serializable>ActionCoordinatorImpl,应将其报告为错误。

在您清楚自己想要做什么之前,很难推荐修复程序。

于 2012-09-20T13:48:15.220 回答