if
是的,您可以在不使用花括号的情况下使用单个语句来跟踪语句(但您真的想要吗?),但您的问题更加微妙。尝试改变:
if (x=y)
到:
if (x==y)
某些语言(例如 PHP)将任何非零值视为 true 并将零(或NULL
, null
, nil
, 不管)视为false
,因此条件中的赋值操作有效。Java 只允许在条件语句中使用布尔表达式(返回或评估为布尔值的表达式)。您看到此错误是因为 的结果(x=y)
是 的值y
,而不是true
或false
。
您可以通过这个简单的示例看到这一点:
if (1)
System.out.println("It's true");
if (true)
System.out.println("It's true");
第一条语句将导致编译失败,因为1
无法转换为布尔值。
编辑:我对您更新示例的猜测(您应该将其放入问题而不是作为新答案)是您realOther
在这些语句中分配它之后尝试访问。这将不起作用,因为范围realOther
仅限于if
/else
语句。您需要将声明移到语句realOther
上方if
(在这种情况下将无用),或者在if
语句中添加更多逻辑):
if (other instanceof Square)
((Square) other).doSomething();
else
((Rectangle) other).doSomethingElse();
为了进一步提供帮助,我们需要查看更多您的实际代码。
编辑:使用以下代码会导致您看到相同的错误(使用 编译gcj
):
public class Test {
public static void Main(String [] args) {
Object other = new Square();
if (other instanceof Square)
Square realOther = (Square) other;
else
Rectangle realOther = (Rectangle) other;
return;
}
}
class Rectangle {
public Rectangle() { }
public void doSomethingElse() {
System.out.println("Something");
}
}
class Square {
public Square() { }
public void doSomething() {
System.out.println("Something");
}
}
if
请注意,在/语句中添加花括号会将else
错误减少为有关未使用变量的警告。我们自己的mmyers指出:
http://java.sun.com/docs/books/jls/third_edition/html/statements.html
说:“每个局部变量声明语句都立即包含在一个块中。” 语句中的
if
那些没有括号,因此它们不在一个块中。
另请注意,我的另一个示例:
((Square) other).doSomething()
编译没有错误。
编辑:但我认为我们已经确定(虽然这是对模糊边缘情况的有趣深入研究),无论你试图做什么,你都没有正确地做到这一点。那么你到底想做什么?