我试图在if - else语句中强制转换对象,如下所示:
if(sourceSystem.equalsIgnoreCase("Src")) {
MO object = (MO) transformer.create(message,sourceSystem,flowName);
} else {
UO object = (URO) transformer.create(message,sourceSystem,flowName);
}
但是不能在这些之外访问它?
validator.validate(object);
无法解析为变量。但肯定是在if-else语句中创建了一个赋值对象。将始终创建对象,因此编译器为什么告诉我它无法解析为变量。是的,如果我需要访问UO和MO之间的常用方法,我会获得本地和全球的可用物品。
答案 0 :(得分:6)
你无法通过这种方式实现自己想要的目标。最好试试这个:
Object object = transformer.create(message,sourceSystem,flowName);
if( object instanceof MO )
{
//cast and use it as MO
}//if
else
{
//cast and use it as UO
}//else
如果UO和MO共享您在每个块中使用的方法,继承可以帮助您对两个块的代码进行分组。
答案 1 :(得分:0)
您实际上声明了名为object
的两个变量。它们中的每一个都有一个非常有限的范围,即它们所在的块。
假设 {/ 1>}语句完成后, 可以访问变量:if
的类型将是什么情况?
您需要在 object
之前声明变量,并在两种情况下分配给它。但是,您需要为此确定单一类型。在最糟糕的情况下,您需要使用if
。
答案 2 :(得分:0)
在if块之外声明它。
YourParentType object;
if(sourceSystem.equalsIgnoreCase("Src"))
{
object = (MO) transformer.create(message,sourceSystem,flowName);
}
else{
object = (URO) transformer.create(message,sourceSystem,flowName);
}
YourParentType
if
重复可能会出现在你的代码中。您可以将它们移动到“工厂”类。 (或者将transformer
作为工厂使用,将if
移入其中,具体取决于它的作用。)答案 3 :(得分:0)
试试这个:
MO MOObject = null;
UO UOObject = null;
if(sourceSystem.equalsIgnoreCase("Src"))
{
MOObject = (MO) transformer.create(message,sourceSystem,flowName);
}
else
{
UOObject = (URO) transformer.create(message,sourceSystem,flowName);
}
然后在后续代码中可以基于这些中的哪一个不是null
。
答案 4 :(得分:0)
变量object
仅在块中已知。如果你想在验证器中使用object
,那么就这样做:
Object object = null;
if(sourceSystem.equalsIgnoreCase("Src")) {
object = transformer.create(message,sourceSystem,flowName);
} else {
object = transformer.create(message,sourceSystem,flowName);
}
validator.validate(object);
甚至更短
validator.validate(transformer.create(message, sourceSystem, flowName));
请注意,不需要强制转换(只要create
返回validate
使用的类型)
答案 5 :(得分:0)
最优雅的方法是声明一个接口(比如MessageInterface)并让你的MO和URO对象实现它。
然后你必须做这样的事情:
MessageInterface messageObject;
if(sourceSystem.equalsIgnoreCase("Src")) {
messageObject = (MO) transformer.create(message,sourceSystem,flowName);
} else {
messageObject = (URO) transformer.create(message,sourceSystem,flowName);
}
validator.validate(object);
如果您无法直接访问MO和URO的声明,您仍然可以通过为它们创建实现上述接口的包装来实现此目的。