porque Map nao extends a interface Collection, entao NUNCA vai ser possivel isso retornar true.
ricardolecheta
tudo bem que o Map não extendes a Colection, mas não compilar por causa disso?
marciolx
Bom, eu andei procurando na JLS e o capítulo 5 versículo 5 diz o seguinte (com relação à conversão de tipos):
no caso seria S instanceof T, ou traduzindo para o código de exemplo da minha dúvida: referência de classe abstrata instanceof interface
Então não ocorre o erro de compilação porque mesmo AbstractMap não tendo nada a ver com Collection, uma subclasse dela poderia implementar a interface Collection, portanto o compilador não tem condições de dizer se o cast está correto ou não e deixa passar.
Eu achava que AbstractMap poderia estender AbstractCollection, aí as coisas ficariam claras, mas uma rápida olhada na API mostra que isso não é verdade. A razão portanto deste código compilar sem erros é que o compilador não pode assumir nada com relação à classe Abstrata porque uma subclasse dela poderia implementar a interface.
Outro exemplo que compila baseado nesta explicação:
No exemplo acima, se eu fosse tentar um cast de AChild para Collection, resultaria em uma runtime exception ClassCastException, mas como eu estou testando com o operador instanceof, apenas imprime false, sem lançar excessão. Note que AChild, assim como AbstractMap não tem nada a ver com Collection.
marciolx
tudo bem que o Map não extendes a Colection, mas não compilar por causa disso?
No caso de interface instanceof interface, se ambas tiverem o mesmo método mas com tipo de retorno diferente, não compila:
O método add da interface I1 tem o tipo de retorno void e entra em conflito com o método add da interface Collection que tem o tipo de retorno boolean.
Assim, se eu mudar o código para: