2012-09-20 45 views
3

我有一个通用的接口,它是由一个类实现的,我想在泛型方法中返回。 接口:用java中的具体实现返回一个通用接口

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 build并不是,并且说“不可转换的类型”。我可以解决这个问题:

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>配合和工程...感谢大家,但我仍然不知道为什么日食什么也不说......

+0

最后一个比上一个不安全。两者都做同样的事情。如果我执行'actionCoordinatorImpl .getAction(0)'? –

+0

这两个版本看起来都是类型安全的。而'javac'是正确的抱怨。 –

+0

你确定它在Eclipse中有效吗?如果它是一个java问题(和“不可转换的类型”指向它),它应该落在两者中)。 – SJuan76

回答

2

问题不在于maven 不会对进行编译,而是Eclipse不会抱怨不安全的转换:您可能在Eclipse偏好设置中关闭了一个选项,并在maven中进行严格编译。

WorkerImpl不适合从你的工厂方法在ActionCoordinatorImpl返回,因为有不能保证Serializable传递给它的doWork()方法将是一个String - 它只是为任何Serializable


此外,您可以通过

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

改变IWorker

public interface IWorker<T, K> 

因为它们是等价的简化代码(一切扩展对象)

+0

好抓!我指着类型擦除,但我更喜欢你的答案。 – SJuan76

+0

有没有办法做到类型安全? –

+0

@peatle_pp不需要你输入'ActionCoordinatorImpl',使它成为一个抽象工厂,或者传递'T'和'K'的类对象,并使用'instanceof'来确定'Worker '返回,但就编译器而言,第二个选项仍然需要“不安全”转换(但由于您已在代码中检查了类型,因此它不会不安全)。总的来说,我认为你的设计需要简化 - 不要太深入地看,你的层数太多了。 – Bohemian

0

WorkerImpl只实现IWorker<String, List<Serializable>> 。然后,您尝试将其设置为中的IWorker<T extends Serializable, K extends Serializable>,这是不正确的,应该报告为错误。

推荐一个修复程序,直到你清楚你想要做什么,这将是difficlt。

+0

谢谢......我想要一个'IActionCoordinator'并调用'getAction()'来为我一个'IWorker '。有了这个Worker,我可以运行'doWork()'方法。调用者不必知道WorkerImpl到底在做什么。 –

0

new WorkerImpl()收益率IWorker<String, List<Serializable>>,你打算如何将它转换为IWorker<T,K>?你认为编译器应该在哪里得到类型K?当你调用getAction时,你会一直通过吗?然后,您还必须传递类型T,但它也由参数requ设置,并且调用看起来很丑。