javac奇怪的语法 - 错误表达式的非法开始
我遇到了一个奇怪的错误,我认为这是一个错误。 这里是一个最小的情况下,请不要对代码的有效性发表意见:)javac奇怪的语法 - 错误表达式的非法开始
class Foo {
static public <X> int bar() { return 42; }
public int baz() {
return true ? 42 : (
Foo.<Void>bar() > 42 ? 41 : 43
)
;
}
}
结果:
err.java:7: illegal start of expression
Foo.<Void>bar() > 42 ? 41 : 43
^
我已经试过SUN SDK的javac 1.6.0_13和1.6.0_21。
的错误消失,当我要么
- 化妆棒()非通用(只是出于好奇,而不是一个真正的选择)
- 删除线各地三元表达括号7
因此,看起来如果e是一个表达式,那么编写(e)并不总是有效的?
是返回值,你没有通过调用一个静态方法来指定这个:
class Foo {
static public <X> int bar() { return 42; }
public int baz() {
return true ? 42 : (
Foo.bar() > 42 ? 41 : 43
)
;
}
}
声明'
正如我试图解释的,这段代码纯粹是为了演示。相信我,在真正的程序中,类型的论点是不可或缺的。 – Ingo 2011-03-23 12:03:23
我设法在代码中对它进行一些修改来编译它。所以我猜这是与条件运算符规范(这有点复杂)或bug有关。但是这个问题只发生在条件运算符中。
class Foo {
static public <X> int bar() { return 42; }
public int baz() {
return true ? 42 : (
((int)Foo.<Void>bar()) > 42 ? 41 : 43
);
}
}
酷!看起来编译器很困惑,并且认为“(Foo)必须启动一个强制转换?” – Ingo 2011-03-23 12:26:10
@Ingo:你说的对,但是一般的指导是'不要对混合数据类型使用条件运算符(因为spec有点复杂) '但在这种情况下你不使用混合类型。 – 2011-03-23 12:28:50
这个bug已经有3年了,但是显然不会在jdk 1.6中修复。然而,它在JDK 1.7 beta 14中得到了修复(开发者预览版是b185,所以它在那里修复了,我试过了)。
感谢Joachim。这就是我担心的(目前我被标准的SDK javac 1.6所困住)。将不得不在Sun/Oracle上搜索bug数据库,以确定它是否已修复。 – Ingo 2011-03-23 12:01:21
该bug已经有3年了,但显然不会在jdk 1.6中修复。但是,它在jdk 1.7 beta 14中得到了修复(开发者预览版是b189,所以它在那里修复)。 – Ingo 2011-03-30 16:37:47
@Ingo:小心添加一个链接到你发现的错误? – 2011-04-08 14:18:05