Bom dia Rodrigo.
Quando você atribui um número decimal a uma variável primitiva o compilador entende esse número como um double. Então se você entrar com 5.0, 45.5, qualquer número com ponto flutuante, este será um double, e como double é maior do que float se fizer:
float f = 5.0;
Está falando para o compilador que quer colocar um literal double em um float e isso ele não deixa! Mas como você sabe que na verdade o valor 5 cabe em um float você faz um cast:
float f = (float)5.0;
ou para simplificar :
float f = 5.0f;
Já no caso do long, todo número que entrarmos sem ponto flutuante é um int, então se fizermos:
long l = 10000000000;
O compilador fala que o número 10000000000 é muito grande para um int, mas novamente, como você sabe que esse numero é para um long e cabe em um long, deve deixar explícito com o l:
long l = 10000000000l;