Por que o Java usa :: para referências de método em vez de.?

7

Muitas vezes me pergunto por que o Java usa ::para referências de método em vez de ., por exemplo, por que escrever

  System.out::println

ao invés de

  System.out.println

Obviamente, pode-se simplesmente responder: "porque os designers decidiram". Por outro lado, eu esperava a segunda sintaxe, porque o ponto é a sintaxe Java comum para acessar os membros da classe.

Existe algum motivo especial conhecido para introduzir a nova ::sintaxe em vez de usar a .convenção existente para referências de métodos?

Giorgio
fonte

Respostas:

20

Isso é para evitar ambiguidade, caso a classe tenha um membro (estático) com o mesmo nome que o método (Java permite isso).

É fácil ver no snippet de código no tutorial Java sobre referências de método :

Como esta expressão lambda chama um método existente, você pode usar uma referência de método em vez de uma expressão lambda:

Arrays.sort(rosterAsArray, Person::compareByAge);

Se a classe Personno snippet acima também tivesse membro nomeado compareByAge(do tipo apropriado para passar Arrays.sort), a notação de ponto não permitiria dizer se o parâmetro se refere ao método ou membro.

mosquito
fonte
2
Obrigado pela resposta e perdoe minha ignorância: eu não sabia que variáveis ​​e métodos de membros tinham o mesmo nome. +1
Giorgio
3

Eles introduziram uma nova sintaxe porque o comportamento não é o mesmo.

Os .meios que você deseja obter uma referência sobre a função para invocá- la logo após.

Quando você usa o método reference ( ::), deseja armazenar uma referência na função, mas não deseja invocá- la imediatamente.

Um aspecto mais prático é como você diferenciaria entre um atributo público e um método com o mesmo nome com o .? Você simplesmente não pode. Com ::não há mais ambiguidade.

Visto
fonte
"O. Significa invocar a função, literalmente executando seu código." Não, o ponto significa acessar o membro. Os parênteses significam chamar a função em linguagens com sintaxe no estilo C (como Java).
Route de milhas
1
@MilesRout De fato, minha resposta é confusa, eu a editei para esclarecer melhor meus pensamentos.
manchado