javac奇怪的语法 - 错误非法启动表达式

时间:2011-03-23 11:48:48

标签: java 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 当我

时,错误消失了
  • 使bar()非通用(只是为了好奇,不是真正的选择)
  • 删除第7行三元表达式周围的括号

所以看起来如果 e 是一个表达式,那么写(e)并不总是有效的吗?

4 个答案:

答案 0 :(得分:6)

发布的代码使用Eclipse编译(并运行)对我来说很好,但我可以确认javac无法编译它。我怀疑你在javac找到了编译器错误。

report it可能是个好主意。

答案 1 :(得分:1)

我设法通过代码中的一点变化来编译它。所以,我猜这与条件运算符规范(有点复杂)或bug有关。但是这个问题只出现在条件运算符中。 / p>

class Foo {

    static public <X> int bar() { return 42; }

    public int baz() {
        return true ? 42 : (
            ((int)Foo.<Void>bar()) > 42 ? 41 : 43
        );
    }
}

答案 2 :(得分:1)

该错误已经有3年了,但显然不会在jdk 1.6中修复。但是,它在jdk 1.7 beta 14中修复(开发者预览版是b185,因此它已修复,我已经尝试过了。)

答案 3 :(得分:-3)

是返回值,您不必通过调用静态方法来指定它:

class Foo {

    static public <X> int bar() { return 42; }

    public int baz() {
        return true ? 42 : (
            Foo.bar() > 42 ? 41 : 43     
        )
        ;
    }
}