Sim... Exatamente. Mas tem um detalhe, o que determina o comportamenteo do seu objeto é o que está a esquerda do = ou seja
Dao<Usuario> dao = new UsuarioDao();
significa que o tipo do seu objeto é o genérico mas que a implementação que a máquina virtual vai executar é a de UsuarioDao. Isso faz muito sentido afinal observe o exemplo a seguir
public class Animal {
public void dormir(){ ... }
}
public class Cachorro extends Animal{
public void latir() { ... }
}
public class Gato extends Animal{
public void miar(){ ... }
}
Animal a = new Cachorro();
você pode fazer tranquilamente a.dormir();
mas como a máquina virtual iria se comportar com a.miar() sendo que o seu objeto é um cachorro? Um cachorro jamais vai miar. Por isso que apenas o método dormir poderá ser executado. Afinal tanto cachorro quanto gato dormem. Essa é a ideia de generalização. Você identifica apenas o que é comum.