Qual é o uso de dizer em vez de

Então, eu estava procurando por algum código Java e me deparei com:

List l; 

Basicamente, essa lista aceita todos os objects que são algum tipo de SomeObject – SomeObject em si ou seus herdeiros. Mas de acordo com o polymorphism, os herdeiros também podem ser vistos como SomeObject, então isso também funcionaria:

 List l; 

Então, por que alguém usaria a primeira opção quando a segunda estiver claramente definida e virtualmente idêntica?

 List l; 

Neste você não pode dizer List l = new ArrayList; ( não permitido ) onde

 List l; 

Você pode dizer

List l = new ArrayList; ( permitido )

Mas note que na List l = new ArrayList; List l = new ArrayList; você não pode adicionar nada à sua lista l porque? representa class desconhecida ( exceto null of course ).

Atualização: Para sua pergunta no comentário What could I possibly do with a list if I cannot add anything to it?

Agora, considere um caso em que você tem que escrever uma function para imprimir sua lista, mas lembre-se de que ela deve aceitar apenas uma List tendo objects que são subclasss de seu SomeObject . Neste caso, como afirmei acima, você não pode usar

public void printList(List someList)

Então, o que você faria? Você faria algo como

  public void printList(List someList) { for(SomeObject myObj : someList) { //process read operations on myObj } 

O link principal que você deseja ler é http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html, que explica o curinga genérico em detalhes.

A List não é o mesmo que List List . Observe o seguinte

 List x = new ArrayList(); List y = new ArrayList(); // x = y; Will throw Compilation exception List z = y; //will pass compilation 

Você pode querer observar que você pode adicionar uma String a ambas as listas x e y, no entanto, será útil quando você escrever uma function de biblioteca (como a printCollection no exemplo mostrado no link) em vez de aceitar uma Collection , caso em que um usuário não pode passar sua lista de seqüências de caracteres que ele tem para o seu método, se você aceitar Collection Collection então o usuário pode passar sua Collection, Collection etc sem ter que criar explicitamente outra lista.

List l; não está aceitando new SomeObject() mas List l; faz.

o que também não está funcionando: List l = new ArrayList()

o que está funcionando: List l = new ArrayList() List l = new ArrayList()

X não pode ser adicionado à List mesmo se X puder ser convertido em Y

Então, no seu segundo caso, se List l; foi permitido adicionar subclass de X, que quebraria o princípio básico do tipo de segurança

Como a primeira resposta,

 List l; 

must contém Object que herda de SomeObject, não algum SomeObject direto.