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