2011-03-23 178 views
8

我遇到了一个奇怪的错误,我认为这是一个错误。 这里是一个最小的情况下,请不要对代码的有效性发表意见:)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)并不总是有效的?

回答

5

张贴的代码编译(并运行)就好了我使用Eclipse,但我可以证实, javac无法编译此。我怀疑你在javac中发现了一个编译器错误。

这可能是一个好主意report it

+0

感谢Joachim。这就是我担心的(目前我被标准的SDK javac 1.6所困住)。将不得不在Sun/Oracle上搜索bug数据库,以确定它是否已修复。 – Ingo 2011-03-23 12:01:21

+1

该bug已经有3年了,但显然不会在jdk 1.6中修复。但是,它在jdk 1.7 beta 14中得到了修复(开发者预览版是b189,所以它在那里修复)。 – Ingo 2011-03-30 16:37:47

+0

@Ingo:小心添加一个链接到你发现的错误? – 2011-04-08 14:18:05

-3

是返回值,你没有通过调用一个静态方法来指定这个:

class Foo { 

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

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

声明''不会**指定返回值,它指定类型参数在这里! – 2011-03-23 11:56:28

+0

正如我试图解释的,这段代码纯粹是为了演示。相信我,在真正的程序中,类型的论点是不可或缺的。 – Ingo 2011-03-23 12:03:23

1

我设法在代码中对它进行一些修改来编译它。所以我猜这是与条件运算符规范(这有点复杂)或bug有关。但是这个问题只发生在条件运算符中。

class Foo { 

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

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

酷!看起来编译器很困惑,并且认为“(Foo)必须启动一个强制转换?” – Ingo 2011-03-23 12:26:10

+0

@Ingo:你说的对,但是一般的指导是'不要对混合数据类型使用条件运算符(因为spec有点复杂) '但在这种情况下你不使用混合类型。 – 2011-03-23 12:28:50

1

这个bug已经有3年了,但是显然不会在jdk 1.6中修复。然而,它在JDK 1.7 beta 14中得到了修复(开发者预览版是b185,所以它在那里修复了,我试过了)。