我知道有一些关于这个主题的帖子,但我无法确定我的问题所在。阅读搜索结果时,我比以往更困惑了。我希望我能清楚地表达我的问题。
我有一个消息类型层次结构和一个用于这些消息的通用处理器层次结构。到目前为止,我已经成功运行了这个程序。现在我想为处理器实现一个工厂方法,并被我选择的通用方法卡住了。请看我的示例:
abstract class Message
{
abstract int getTest();
}
class MyMessage1 extends Message
{
@Override
int getTest()
{
return 1;
}
}
class MyMessage2 extends Message
{
@Override
int getTest()
{
return 2;
}
}
interface Processor<T extends Message>
{
void initialize(final T p_message);
void doWork();
}
abstract class BaseMessageProcessor<T extends Message> implements Processor<T>
{
private T message;
@Override
public void initialize(T p_message)
{
message = p_message;
}
protected T getMessage()
{
return message;
}
}
class MyMessage1Processor extends BaseMessageProcessor<MyMessage1>
{
@Override
public void doWork()
{
// perfectly valid assignment
MyMessage1 msg = getMessage();
// do something
}
}
class MyMessage2Processor extends BaseMessageProcessor<MyMessage2>
{
@Override
public void doWork()
{
// perfectly valid assignment
MyMessage2 msg = getMessage();
// do something
}
}
目前这个部分是有效的,并且按预期工作。但是现在需要使用工厂:
class ProcessorFactory
{
<T extends Message> Processor<T> createProcessor(final Class<T> p_msgType)
{
if (p_msgType.equals(MyMessage1.class))
{
// Type mismatch: cannot convert from MyMessage1Processor to Processor<T>
return new MyMessage1Processor();
}
else if (p_msgType.equals(MyMessage2.class))
{
// Type mismatch: cannot convert from MyMessage2Processor to Processor<T>
return new MyMessage2Processor();
}
else
{
throw new Exception("Unsupported message type: " + p_msgType);
}
}
}
也许我在这里犯了一个愚蠢的错误,但我看不到。如果有人能给我提示,我会很感激。
敬礼
塞巴斯蒂安
编辑: 好吧,我的错。问题在于我得到了编译器错误,如注释中所述,“默认区域设置”(例如,对于第二个返回语句,我得到了编译错误):
类型不匹配:无法从MyMessage2Processor转换为Processor
IntegerArrayList extends ArrayList<Integer>
)时的常见陷阱。据我所知,您不能再将它们泛化处理。 - David Harknessif (p_msgType.equals(MyMessage1.class)) { return new BaseMessageProcessor<T>() { @Override public void doWork() { } }; }
这等同于我的子类化。 - Sebastian Götz