Por que chamar um método não requer uma importação da classe?

prato:

Algo peculiar me deparei com o outro dia.

Considere o seguinte código (que recolhe as contagens de comprimento palavra distintas dos dados Strings, mas isso não é importante):

static void collectByLambda(Collection<String> list) {
    Collection<Integer> collected = list.stream().collect(Collectors.collectingAndThen(
            Collectors.groupingBy(String::length),
            m -> m.keySet()
    ));
}

e a sua versão de referência método equivalente:

static void collectByMethodReference(Collection<String> list) {
    Collection<Integer> collected = list.stream().collect(Collectors.collectingAndThen(
            Collectors.groupingBy(String::length),
            Map::keySet
    ));
}

O primeiro (lambda) versão não exige que você para import java.util.Mapcompilar, o segundo faz.

Por que isso é exatamente? Eu posso imaginar que é porque a segunda versão precisa ter acesso à Mapclasse em tempo de compilação para construir a referência; mas como ele sabe que Map#keySet()existe mesmo se não importar Map?

piet.t:

Note-se que importé apenas um meio para permitir que você usar classe-nomes não qualificados em seu código, nada mais.

Desde o primeiro exemplo não menciona explicitamente o nome da classe Map, não há necessidade para permitir a notação abreviada, enquanto o segundo exemplo faz mencioná-lo. Note-se que o segundo exemplo irá funcionar sem a importação ao usar o nome totalmente qualificado:

static void collectByMethodReference(Collection<String> list) {
    Collection<Integer> collected = list.stream().collect(Collectors.collectingAndThen(
            Collectors.groupingBy(String::length),
            java.util.Map::keySet
    ));
}

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=136440&siteId=1
Recomendado
Clasificación