Не удается разрешить метод tailMap для TreeMap - PullRequest
0 голосов
/ 12 октября 2018

Почему TreeMap типа Map не определяет методы tailMap или headMap.

Map<String, String> map = new TreeMap<>();
map.tailMap();  //cannot resolve method tailMap

При явном приведении это работает:

((TreeMap<String, String>) map).tailMap("a");

СNavigableMap все хорошо:

NavigableMap<String, String> map1 = new TreeMap<>();
map1.tailMap("a");

Если я прав, то из-за интерфейса Map отсутствуют соответствующие методы, несмотря на то, что объект map является конкретной реализацией класса TreeMap который, безусловно, обладает такими методами.

Просто ищу более подробное объяснение.

Спасибо!

1 Ответ

0 голосов
/ 12 октября 2018

Объект типа TreeMap имеет метод tailMap, но вы ссылаетесь на него через ссылку типа Map, которая не раскрывает сам метод tailMap.Вот почему компилятор жалуется.

Обратите внимание, что Java статически типизирован .Это означает, что компилятор должен убедиться во время компиляции , что существует метод для вызова независимо от фактической реализации.

Поскольку у вас может быть реализация Map, которая не определяет метод tailMap, компилятор не позволит вам вызывать метод tailMap для объекта, на который ссылаются через Map.

, так как интерфейс NavigableMap определяет методtailMap, вы можете вызывать метод для любого объекта, на который ссылается NavigableMap.Это также применимо, если вы используете TreeMap в качестве ссылочного типа, поскольку TreeMap реализует NavigableMap.Вот почему компилятор не жалуется во втором и третьем примерах (явное приведение и объявление ссылки NavigableMap).

...