¿Por qué llamar a un método no requiere una importación de la clase?

plato:

Algo peculiar que tropezó el otro día.

Considere el siguiente código (que recoge los distintos recuentos de longitud de palabra de los dados Strings, pero eso no es importante):

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

y su versión de referencia método equivalente:

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

El primero (lambda) versión no requiere que import java.util.Mappermite compilar, el segundo lo hace.

¿Por qué es esto exactamente? Me puedo imaginar que es porque la segunda versión tiene que tener acceso a la Mapclase en tiempo de compilación para construir la referencia; pero ¿cómo sabe que Map#keySet()existe incluso si no importa Map?

piet.t:

Tenga en cuenta que importes sólo un medio para permitir que el uso de nombres de clase no cualificado en su código, nada más.

Desde el primer ejemplo no menciona explícitamente el nombre de la clase Mapque no hay necesidad de permitir la notación abreviada, mientras que el segundo ejemplo lo menciona. Tenga en cuenta que el segundo ejemplo funcionará sin importar cuando se utiliza el nombre completo:

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

Supongo que te gusta

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