странный синтаксис javac - ошибка неверного начала выражения - PullRequest
9 голосов
/ 23 марта 2011

Я столкнулся со странной ошибкой, которую я считаю ошибкой.Вот минимальный случай, пожалуйста, не комментируйте полезность кода:)

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 ]

6 голосов
/ 23 марта 2011

Опубликованный код компилируется (и запускается) для меня с помощью Eclipse, но я могу подтвердить, что javac не скомпилирует это.Я подозреваю, что вы нашли ошибку компилятора в javac.

Возможно, было бы неплохо сообщить об этом .

1 голос
/ 30 марта 2011

Ошибка уже около 3 лет, но, очевидно, она не будет исправлена ​​в jdk 1.6.Тем не менее, это исправлено в jdk 1.7 beta 14 (предварительный просмотр для разработчика - b185, так что там это исправлено, я пробовал).

1 голос
/ 23 марта 2011

Мне удалось скомпилировать его с небольшим изменением в коде. Итак, я предполагаю, что это как-то связано со спецификацией условного оператора (которая немного сложна) или с ошибкой. Но эта проблема возникает только в условном операторе.

class Foo {

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

    public int baz() {
        return true ? 42 : (
            ((int)Foo.<Void>bar()) > 42 ? 41 : 43
        );
    }
}
0 голосов
/ 23 марта 2011

- это возвращаемое значение, вам не нужно указывать это, вызывая статический метод:

class Foo {

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

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