Meu tipo de IDE ( NetBeans ) verifica meu Collections
código enquanto estou digitando. Mas então, por que tenho que lançar o objeto retornado Object.clone()
? O que é bom. Nenhum dano, nenhuma falta. Mas ainda assim, eu não entendo.
A verificação de tipo, sem conversão, o objeto retornado Object.clone()
não é possível? A estrutura de genéricos me faz pensar que o IDE poderia verificar o tipo de referência de objeto no lado direito da marca " = " sem transmitir enquanto estou digitando? Eu não entendo.
adendo
Meu caso de uso foi justamente porque eu tinha um Calendar
campo privado , pubdate . Eu ia escrever:
Calendar getPubdate() {
return pubdate;
}
mas existe o risco de o invocador poder modificar meu pubdate , então retornei uma cópia:
Calendar getPubdate() {
return (Calendar) pubdate.clone();
}
Então, eu me perguntava por que eu precisava lançar pubdate.clone()
. A assinatura do método tem o tipo ali. O NetBeans deve ser capaz de descobrir isso. E o NetBeans parecia estar fazendo algo semelhante em relação a Collections
.
MyObject
emclone()
vez deObject
- isso remove todo esse problema. Além disso, é recomendável nunca usarclone()
(Item efetivo 11 do Java).this.clone()
no objeto programador, especialmente na noite de Wed após o lançamento de Tue. Desculpe, mas eu tenho que escrever este comment..Why pode IDE não é inteligente apenas corrige todos os erros para nós LOLRespostas:
Porque ele retorna
Object
.Object.clone
não é genérico.Se os genéricos existissem quando
clone
foram projetados, provavelmente seria assim (usando o polimorfismo com limite de F):Se o Java tivesse um recurso MyType, talvez fosse assim:
Mas os genéricos não existiam quando
Object.clone
foram projetados e o Java não possui MyTypes; portanto,Object.clone
é com a qual devemos trabalhar a versão não segura do tipo .fonte
original
?Este não é um recurso de nenhum IDE, mas da definição de linguagem.
Um IDE ajuda você a usar uma linguagem de programação com mais eficiência, não altera a semântica dessa linguagem. Isso significa que um ajudante de editor pode inserir automaticamente uma conversão quando for óbvio qual você deseja, mas não pode simplesmente quebrar as regras da linguagem e fingir que o código que não compila é válido.
Editar É verdade que um IDE pode agrupar seu próprio compilador e, de fato, muitos fazem exatamente isso, por exemplo, para obter melhores relatórios de erros com mais informações internas na árvore de análise parcial. No entanto, seria uma péssima idéia permitir que esse compilador interno implemente semântica de idioma diferente do SDK oficial, pois isso significaria que o código que funciona no desenvolvimento pode misteriosamente começar a falhar quando instalado na produção - produzindo problemas que, por definição, são debuggable!
fonte
Isso ocorre devido à assinatura de tipo do método Object.clone. A assinatura de tipo indica que o método retornará um objeto do tipo Object.
As coleções usarão os chamados tipos genéricos para substituir automaticamente o tipo de conversão.
Então, se você tem este código:
o compilador adicionará os lançamentos para você nos bastidores, para que o código seja realmente:
fonte
Para ser completo, desde o Java 5, tipos de retorno covariantes são permitidos . Então você pode escrever o seguinte:
Com isso, o seguinte código é legal:
fonte