¿Por qué TreeMap
el tipo Map
no define los métodos tailMap
o headMap
.
Map<String, String> map = new TreeMap<>();
map.tailMap(); //cannot resolve method tailMap
Con conversión explícita funciona:
((TreeMap<String, String>) map).tailMap("a");
Con NavigableMap
todo está bien:
NavigableMap<String, String> map1 = new TreeMap<>();
map1.tailMap("a");
Si estoy en lo correcto que se debe a la interfaz Map
que carecen de métodos correspondientes, a pesar de la cara que el objeto map
es la aplicación concreta de la clase TreeMap
que sin duda sí posee los dichos métodos.
Sólo en busca de una explicación más detallada.
¡Gracias!
El objeto de tipo TreeMap
tiene el método tailMap
, pero se hace referencia a ella a través de una referencia de tipo Map
, que no exponga al tailMap
método en sí. Es por ello que el compilador se queja.
Tenga en cuenta que Java es de tipo estático . Esto significa que las necesidades del compilador para asegurarse de que en tiempo de compilación que hay un método a llamar independientemente de la implementación real.
Puesto que usted podría tener una Map
aplicación que no define el tailMap
método, el compilador no le permitirá invocar el tailMap
método en un objeto referenciado por medio Map
.
Dado que la NavigableMap
interfaz define el método tailMap
, que son capaces de invocar el método en cualquier objeto referenciado vía NavigableMap
. Esto también se aplica si se utiliza TreeMap
como tipo de referencia, ya que TreeMap
los implementos NavigableMap
. Es por esto que el compilador no se queja en sus ejemplos segundo y tercero (la conversión explícita y la NavigableMap
Declaración de la referencia).