在if-else语句中进行转换

时间:2011-08-24 13:32:09

标签: java variables if-statement variable-assignment

我试图在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之间的常用方法,我会获得本地和全球的可用物品。

6 个答案:

答案 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);
    }
  • MO和URO是相关对象,您可能希望拥有这些对象的公共父级。这个类是YourParentType
  • 的意思
  • 您尝试做的与Factory Design Pattern类似。你会发现这种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的声明,您仍然可以通过为它们创建实现上述接口的包装来实现此目的。