Почему использование ключевого слова void перед синхронизацией приводит к ошибке в Java, но обратное работает нормально? - PullRequest
0 голосов
/ 01 июня 2019
import java.util.*;

public class Deadlock extends Thread{

    private String name;    

    public static void main(String[] args) {        

    }

    public class MyObject{
        public void synchronized foo(String name) { //throws error saying 'Syntax error on token "void", volatile expected' 

        }       
    }   
}

Но если public void synchronized изменить на public synchronized void, все в порядке.

Почему это?

Ответы [ 2 ]

4 голосов
/ 01 июня 2019

Посмотрите на спецификацию Java 8.4.3.Модификаторы метода , которые говорят:

MethodModifier:
    (one of) 
    Annotation public protected private 
    abstract static final synchronized native strictfp

Они должны предшествовать типу возврата, который идет последним.Порядок модификаторов на самом деле не имеет значения, поскольку они уважают тип возвращаемого значения как последний.Вот почему public synchronized void действителен.

0 голосов
/ 01 июня 2019

Что ты возвращаешь?Вы возвращаете синхронизированный или вы возвращаете void?Поскольку синхронизированный не то, что вы можете вернуть, он должен быть недействительным.Видите ли, тип возвращаемого значения всегда должен идти непосредственно перед именем функции.

...