返回带有java具体实现的通用接口

返回带有java具体实现的通用接口,java,generics,maven,Java,Generics,Maven,我有一个由类实现的泛型接口,我希望以泛型方法返回该接口。 接口: public interface IWorker<T extends Object, K extends Object> { public K doWork(T o); } 公共接口IWorker{ 公共K道具(TO); } 实施: public class WorkerImpl implements IWorker<String, List<Serializable>> { @O

我有一个由类实现的泛型接口,我希望以泛型方法返回该接口。 接口:

public interface IWorker<T extends Object, K extends Object> {  
public K doWork(T o);
}
公共接口IWorker{
公共K道具(TO);
}
实施:

public class WorkerImpl implements IWorker<String, List<Serializable>>
{
   @Override
   public List<Serializable> doWork(String s)
   {
       return ...
   }
}
public interface IActionCoordinator
{
    public <T extends Serializable, K extends Serializable> IWorker<T, K> getAction(T  request);
}
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();
    }
}
公共类WorkerImpl实现IWorker
{
@凌驾
公共列表doWork(字符串s)
{
返回。。。
}
}
返回实现的通用方法的ActionCoordinator接口:

public class WorkerImpl implements IWorker<String, List<Serializable>>
{
   @Override
   public List<Serializable> doWork(String s)
   {
       return ...
   }
}
public interface IActionCoordinator
{
    public <T extends Serializable, K extends Serializable> IWorker<T, K> getAction(T  request);
}
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();
    }
}
公共接口协调器
{
公共IWorker getAction(T请求);
}
行动协调员执行:

public class WorkerImpl implements IWorker<String, List<Serializable>>
{
   @Override
   public List<Serializable> doWork(String s)
   {
       return ...
   }
}
public interface IActionCoordinator
{
    public <T extends Serializable, K extends Serializable> IWorker<T, K> getAction(T  request);
}
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();
    }
}
公共类ActionCoordinatorImpl实现IActionCoordinator
{
@凌驾
公共IWorker getAction(最终要求)
{
返回(IWorker)新WorkerImpl();
}
}
问题: 在eclipse中,这将起作用,但使用JDK1.6.035进行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;
    }
}
公共类ActionCoordinatorImpl实现IActionCoordinator
{
@凌驾
公共IWorker getAction(最终要求)
{
对象温度=新的WorkerImpl();
返回(IWorker)温度;
}
}
但这是不应该的,那根本就不是类型安全的

一些想法会很好。先谢谢你

编辑:现在对我有效的方法如下:
我将所有通用Ts和Ks更改为可序列化。这就是我所需要的,来限制工人的行为。实际的调用者仍然需要一个
IWorker
,但是
IWorker
适合并且可以工作…谢谢大家,但我仍然想知道为什么eclipse没有说什么…

问题不是maven不会编译,Eclipse并没有抱怨不安全的强制转换:您可能在Eclipse首选项中关闭了一个选项,并且正在maven中进行严格的编译


您的
WorkerImpl
不适合从
ActionCoordinatorImpl
中的工厂方法返回,因为无法保证传递给其
doWork()
方法的
Serializable
将是一个
字符串
-它必须是任何
可序列化的


此外,您还可以通过将
IWorker

public interface IWorker<T extends Object, K extends Object>
公共接口IWorker

公共接口IWorker

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

您的
WorkerImpl
只实现
IWorker
。然后尝试将其设置为
ActionCoordinatorImpl
中的
IWorker
,这是不正确的,应报告为错误


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

newworkerImpl()
产生
IWorker
,您将如何将其转换为
IWorker
?您认为编译器应该从哪里获得类型
K
?调用
getAction
时是否总是显式传递它?然后您还必须传递type
T
,但它也是由参数
requ
设置的,调用看起来会很难看。

最后一个调用的安全性不低于前一个。两者都做同样的事情。如果我执行
actionCoordinatorImpl.getAction(0)
,该怎么办?两个版本似乎都不是类型安全的。而且
javac
的抱怨是对的。您确定它在Eclipse中工作吗?如果它是一个java问题(并且“不可转换类型”指向它),那么它应该同时属于这两个方面)!我指的是类型擦除,但我更喜欢你的答案。有没有办法做到类型安全?@peatle_pp No.你要么需要键入
ActionCoordinatorImpl
,有效地使它成为一个抽象工厂,或者为
T
K
传入
class
对象,并使用
instanceof
确定返回哪个
Worker
impl,但就编译器而言,第二个选项仍然需要“不安全”强制转换(但它不会不安全,因为您已经检查了输入代码)。总的来说,我想说你的设计需要简化——不要看得太深,似乎你有太多的层次。谢谢……我想找一个
IActionCoordinator
,然后调用
getAction()
给我找一个
IWorker
。有了这个Worker,我可以运行
doWork()
方法。调用方不必知道WorkerImpl到底在做什么。