Allora:
HashMap<String,String> hm = new LinkedHashMap<String,String>();
Nota che qui la variabile (ovvero il tipo "statico" del reference) è HashMap mentre l'oggetto realmente istanziato e assegnato è un LinkedHashMap.
Su hm puoi invocare solo metodi "noti" ad HashMap. Non puoi invocare i metodi specifici di LinkedHashMap come ad esempio removeEldestEntry. Ma questo è principalmente per come funziona Java.
Java è un linguaggio statically-typed, ovvero il compilatore effettua in anticipo tutta una serie di controlli. Non è come in altri linguaggi "dinamici" dove se un campo/metodo esiste realmente o no lo si scopre solo a runtime!
Ma tutti i metodi noti ad HashMap li puoi invocare. Alcuni metodi possono essere definiti solo in HashMap, altri ridefiniti da LinkedHashMap. Ad esempio il get è ridefinito da LinkedHashMap perché deve fare qualcosa in più mentre il size() rimane quello di HashMap perché è già corretto/sensato anche per LinkedHashMap visto che il grosso è appunto implementato in HashMap.
Queste finezze però alla fine non interessano più di tanto. L'oggetto è realmente un LinkedHashMap quindi nella sua interezza il comportamento è quello di LinkedHashMap. Che rispetto a HashMap ha solo in più la capacità di poter garantire un insertion-order o al limite un access-order. E questo lo puoi sfruttare anche "vedendo" l'oggetto come HashMap, perché non è una questione di metodo in più o no ma di "comportamento".
Andrea, andbin.dev – Senior Java developer – SCJP 5 (91%) • SCWCD 5 (94%)
java.util.function Interfaces Cheat Sheet — Java Versions Cheat Sheet