[code]
List lista = null;
lista.add(5d);[/code] :shock: :shock: :shock: :shock: :shock:
Sei que todo mundo já deu seu pitaco, mas vou dar o meu tbm
lina, é o seguinte, a partir do Java 5 existe a possibilidade de se usar tipos genéricos e eles funcionam da seguinte maneira:
Java 1.4 ou anterior:
[code]
// as coleções armazenam “apenas” Objects, ou seja, qualquer tipo de instância.
List lista = new ArrayList();
lista.add( “string” );
lista.add( new Integer( 1 ) );
lista.add( new JLabel( “label” ) );
// sendo assim, para recuperar os dados vc teria que dar um cast explícito
String s = ( String ) lista.get( 0 );
Integer i = ( Integer ) lista.get( 1 );
JLabel l = ( JLabel ) lista.get( 2 );[/code]
É claro que você vai logicamente guardar instâncias da mesma classe, coloquei vários tipos só para exemplificar.
Já a partir do Java 5, com os genéricos, vc pode especificar que uma coleção (ou mesmo uma classe que você implementou) vai trabalhar com dados de uma classe específica. Se caso vc não especifique, o compilador irá gerar um warning avisando que você está realizando operações que não são seguras. Tome como exemplo o que passei acima. Vamos supor que em tempo de execução sua lista armazenou outra String na segunda posição. Se vc der o cast para Integer vai dar problema (ClassCastException). Os genéricos asseguram que uma coleção (ou uma classe sua como falei) vai guardar apenas referências de um tipo específico, não tendo problema ao tentar recuperar esses dados. O legal é que ao recuperar não há a necessidade de se realizar um cast. Vamos ao exemplo:
[code]
List< String > lista = new ArrayList< String >();
lista.add( “olá” );
lista.add( “genéricos” );
// não tem o cast!
String s1 = lista.get( 0 );
String s2 = lista.get( 1 );[/code]
Outra coisa importante a se notar é que tbm a partir do Java 5, existe o auto boxing e o auto unboxing que servem respectivamente para empacotar um primitivo em sua classe empacotadora e desempacotar um primitido de sua classe empacotadora. Olha o exemplo
Integer i = 1;
Double d = .1;
Character c = 'a';
Sendo assim, se vc tiver uma coleção que use como tipo um Double por exemplo, vc pode passar um literal double diretamente para a coleção
[code]
List< Double > lista = new ArrayList< Double >();
lista.add( 1d );
lista.add( 2d );
lista.add( 3.5 );
Double d1 = lista.get( 0 );
double d2 = lista.get( 1 );
double d3 = d1 + d2;[/code]
Só mais uma coisa, o cast implícito de int para Double não funciona no casso de se usar o boxing e unboxing, por exemplo
[code]
// tipos imcompatíveis
Double d1 = 1;
// ok, 2 é um double
Double d2 = 2d;
// ok, cast implícito
double d3 = 1;[/code]
Último detalhe, os genéricos e o boxing/unboxing são serviços do compilador. Ele primeiro converte o código para código “antigo” realizando os casts necessários e depois compila o código. São apenas “atalhos” de codificação.
Até mais!