Escolar Documentos
Profissional Documentos
Cultura Documentos
Arrays são objetos que armazenam diversas variáveis do mesmo tipo. Eles podem
conter variáveis de referência primitivas ou de objeto, mas o array propriamente dito
sempre será um objeto da pilha, mesmo se for declarado para armazenar elementos
primitivos. Em outras palavras, não existe algo como um array primitivo, mas você
pode criar um array de elementos primitivos.
Array de 10 elementos
O programa a seguir cria um array de inteiros, atribui algumas posições a ele, e imprime
cada valor à saída padrão.
class ArrayDemo {
Declarando um array
Como declarações para variáveis de outros tipos, uma declaração de array tem dos
componentes: o tipo do array e o nome do array. O tipo de um array é escrito como
tipo[], onde tipo é o tipo de dados dos elementos contidos no array; os colchetes são
caracteres especiais que indicam que essa variável na verdade é um array.
Como com as variáveis de outros tipos, a declaração não cria realmente o array - diz
simplesmente ao compilador que esta variável terá um array do tipo especificado.
byte[] meuArrayDeBytes;
short[] meuArrayDeShorts;
long[] meuArrayDeLongs;
float[] meuArrayDeFloats;
double[] meuArrayDeDoubles;
boolean[] meuArrayDeBooleans;
char[] meuArrayDeChars;
String[] meuArrayDeStrings;
Essa forma é menos utilizada, pois com os colchetes antes do nome do array fica mais
fácil entender de que se trata de um array.
Alternativamente, você pode usar atalhos de sintaxe para criar e inicializar um array:
int[] meuArray = {100, 200, 300, 400, 500, 600, 700, 800, 900, 1000};
Você também pode declarar um array de arrays (também conhecido como array
multidimensional), utilizando dois ou mais conjuntos de colchetes [][]. Cada elemento,
deve conseqüentemente ser alcançado por um número correspondente de valores de
índice.
class ArrayMultiDemo {
public static void main(String[] args) {
}
}
Por fim, você pode utilizar a propriedade length para determinar o tamanho de um
array. O código
System.out.println (meuArray.length);
Olá a todos, nesse artigo irei demonstrar como criar uma conexão com um banco de
dados, estarei utilizando o MySQL mas esse modelo se aplica a qualquer outro banco,
basta apenas para isso trocar o driver de acesso ao banco.
Para facilitar a vida de vocês, segue o script de criação da tabela que iremos utilizar no
nosso banco MySQL:
Primeiro uma breve descrição da nossa aplicação, iremos desenvolver uma aplicação
que recebe "comandos" e parâmetros para o mesmo, podemos informar os comandos:
- incluir: que irá incluir um usuário em nossa base de dados
- excluir: que irá excluir um usuario de nossa base de dados
- listar: que irá listar os usuários cadastrados em nossa base de dados
A aplicação está dividida em duas partes, uma classe com os dados de conexão com
banco e os métodos para incluir, excluir e listar, e uma classe que controla os dados de
entrada do usuário.
public Banco(){
// método construtor quando chamado já irá se
conectar ao banco de dados
try {
Class.forName(this.DRIVER);
this.conn =
DriverManager.getConnection(URL,USERNAME,PASSWORD);
try {
// executa a query e guarda o resultado no
RecordSet rs
stmt = this.conn.createStatement();
rs = stmt.executeQuery(sql);
// enquanto houver dados no RS, retira os
campos desejados (cod_usuario, nome e email) e mostra na
tela
while(rs.next()){
// cod_usuario, nome e email são os nomes
dos campos da tabela usuario
} catch(SQLException e){
System.out.println("erro listando usuarios: " +
e.getMessage());
} finally {
try {
// fecha o stmt e o rs
if(stmt != null) stmt.close();
if(rs != null) rs.close();
} catch (SQLException e){
System.out.println("erro ao tentar fechar o
stmt e o rs: " + e.getMessage());
}
}
try {
stmt = this.conn.createStatement();
stmt.executeUpdate(sql);
} catch(SQLException e){
System.out.println("erro incluir usuario: " +
e.getMessage());
} finally {
try {
// fecha o stmt
if(stmt != null) stmt.close();
} catch (SQLException e){
System.out.println("erro ao tentar fechar o
stmt: " + e.getMessage());
}
}
try {
stmt = this.conn.createStatement();
stmt.executeUpdate(sql);
System.out.println("usuário excluido com
sucesso!");
} catch(SQLException e){
System.out.println("erro excluir usuario: " +
e.getMessage());
} finally {
try {
// fecha o stmt
if(stmt != null) stmt.close();
} catch (SQLException e){
System.out.println("erro ao tentar fechar o
stmt: " + e.getMessage());
}
}
} else {
if(args[0].equals("incluir")){
System.out.println("Vai incluir");
} else if(args[0].equals("excluir")){
System.out.println("Vai excluir");
} else if(args[0].equals("listar")) {
System.out.println("vai listar os
usuários");
} else {
System.out.println("Comando inválido,
digite o comando "incluir" ou "listar".");
System.exit(0);
}
}
}
}
Executando processos paralelos com a utilização de Threads
Nesse artigo irei demonstrar como podemos executar mais de uma tarefa ao mesmo
tempo utilizando Threads do Java, com esse recurso é possível iniciar mais de um
processo ao mesmo tempo, controlar cada um dos processos a ponto de fazer com que o
seu programa aguarde a finalização dos mesmos para continuar a execução ou fazer
com que o seu programa continue a execução enquanto os processos ainda estão
rodando.
Como sempre estarei colocando primeiro os códigos fonte dos arquivos. Para esse
exemplo estaremos utilizando duas classes, uma que será a nossa "Thread" em si, e a
outra será quem estará controlando/utilizando essa nossa Thread, através desse
controlador iremos instanciar duas vezes a nossa Thread e as duas instancias estarão
rodando ao mesmo tempo.
Para a nossa thread (MyThread) em si criei um exemplo bem simples, é apenas uma
classe que estende o objeto Thread do java, nela temos um método chamado "run", que
quando executado imprime uma mensagem X vezes na tela.
t1.start();
t2.start();
//t1.join();
//t2.join();
System.out.println("Fim do Programa");
}
}
Entendendo o código:
Aqui dizemos que nossa classe MyThread é uma subclasse da classe Thread, que é
fornecida pelo pacote java.lang (por isso não precisamos fazer nenhum import).
public class MyThread extends Thread {
O primeiro método da classe é o seu construtor, que recebe uma String e atribui o valor
recebido a variável "message".
public MyThread(String message) {
this.message = message;
}
O método seguinte é o método "run", esse é o método principal dessa classe pois é por
aqui que damos início a execução da mesma.
public void run() {
for (int i = 0; i < this.qtdRepeticoes; i++) {
System.out.print(message);
}
System.out.println("FIM da Thread: " + message +
"!");
}
No nosso caso quando esse método for chamado ele fará com que seja impresso na tela
o valor da variável "message" a quantidade de vezes definida na variável
"qtdRepeticoes" e assim que terminar escreverá "FIM da Thread: X !".
Nota: Eu deixei o número de repetições alto (500) pois caso contrário quando estiver
rodando você não conseguirá ver a execução das duas Threads ao mesmo tempo.
Agora vamos ver a nossa classe CallMyThread, nessa classe temos apenas o método
"main" que cria dois objetos do tipo "MyThread":
MyThread t1 = new MyThread("a");
MyThread t2 = new MyThread("b");
Para o primeiro objeto passamos como parâmetro a letra "a" e para o segundo passamos
a letra "b".
Notem que para que a segunda thread "t2" rode, não é necessário que a primeira tenha
terminado de executar, ou seja, o programa inicia a "t1", depois a "t2" e em seguida já
mostra na tela "Fim do programa":
System.out.println("Fim do programa");
Como as duas threads estarão rodando ao mesmo tempo, e cada uma delas imprimindo
na tela valores diferentes - "a" e "b", você verá "a" e "b" misturados na tela.
Rode o programa algumas vezes e você terá resultados diferentes a cada vez, em
algumas vezes a frase "Fim do programa" irá aparecer logo no início, outras vezes não e
a seqüência de "a" e "b" será diferente.
É bem simples, note que quando você rodou o seu programa na maioria (senão em
todas) as vezes, você recebeu a mensagem "Fim do programa" logo no início, antes
mesmo da seqüência de "a" e "b", isso acontece porque você esta falando para o seu
programa:
1 - criar duas threads
2 - rodar essas duas threads
3 - mostrar a mensagem "fim" na tela
Como estamos criando threads, o programa vai criar as threads como um processo
separado e continuar a sua execução, como o processo de "mostrar a frase fim" é mais
rápido do que fazer um "for" ele acaba mostrando antes das threads rodarem.
Porém existe uma forma de dizer ao programa "Ei, rode as threads ao mesmo tempo,
mas espere até que elas terminem para avançar", isso é feito chamando o método "join"
de cada thread.
Descomente as linhas:
t1.join();
t2.join();
E veja que agora a frase "Fim do programa" sairá sempre no final, depois que as duas
threads já finalizaram.
Nota: A utilização do método "join" por causar uma "InterruptedException", por isso
devemos realizar o tratamento dessa exception, o fazer um "throw" como fazemos aqui.
public static void main(String[] args) throws
InterruptedException {
Entendendo o funcionamento
A seguinte ilustração descreve uma aplicação distribuída RMI que utiliza o "RMI
registry" para obter uma referência a um objeto remoto. O servidor chama o "registry"
para associar (bind) um nome com um objeto remoto. O cliente olha o objeto remoto
por seu nome no "registry" do servidor, e invoca então um método nele. A ilustração
mostra também que o sistema do RMI utiliza um web server existente para carregar
definições da classe, do servidor ao cliente e do cliente ao servidor, para objetos quando
necessário.
Utilizar RMI para desenvolver uma aplicação distribuída envolve estas etapas gerais:
1 - Projetando e implementando os componentes de sua aplicação distribuída.
2 - Compilando o código fonte.
3 - Fazendo com que as classes sejam acessíveis via rede.
4 - Iniciando a aplicação.
Para nossa aplicação modelo iremos criar uma classe servidora que irá conter um
método que será invocado remotamente através da utilização de RMI, para isso iremos
precisar de alguns arquivos:
- Ola.java (interface que será implementada tanto pelo server quando pelo client)
- OlaImpl.java (implementação do servidor)
- Cliente.java (client que fará uso de métodos do OlaImpl - server)
Como sempre vamos aos códigos fontes, para esse as explicações serão inseridas na
forma de comentários dentro dos próprios arquivos (assim pouparemos espaço aqui).
Ola.java
Interface que será utilizada tanto pelo servidor quanto pelo cliente, é necessária para
fazer a integração de ambos.
import java.rmi.Remote;
import java.rmi.RemoteException;
OlaImpl.java
Classe que será acessada remotamente pelo Client.java
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
try {
// aqui criamos o objeto que sera acessado
// remotamente
OlaImpl obj = new OlaImpl();
Client.java
Classe que irá rodar do lado do cliente e utilizará o método "showMsg" da classe
OlaImpl que estará rodando do lado do servidor.
import java.rmi.Naming;
/*
* obj é o identificados que iremos utilizar para
fazer
* referencia ao objeto remoto que será
implementado
*/
Ola obj = null;
try {
/*
* - o lookup carrega o OlaImpl_Stub do
CLASSPATH
* - 127.0.0.1 é o IP da máquina onde o server
* está rodando, no nosso caso é a mesma
máquina
* - OlaServidor é o nome que utilizamos para
fazer
* referencia ao objeto no servidor
*/
Além da compilação básica devemos criar uma classe do tipo Stub para a classe que
será acessada remotamente, para criar essa classe devemos rodar o comando:
rmic OlaImpl
Para que as classes possam ser acessadas via rede, precisamos inicializar o servidor de
rmi através do comando:
start rmiregistry (para linux/unix normalmente é somente rmiregistry)
4 - Iniciando a aplicação.
Agora vamos rodar nossa aplicação, vamos abrir dois prompts do DOS, no primeiro
colocamos o server para rodar com o comando:
java OlaImpl
Com o servidor rodando vamos para a outra janela do DOS e rodamos o client com o
comando:
java Client
Basicamente o que fizemos foi, criar um objeto chamado "OlaImpl" com um método
chamado "showMsg" do lado do servidor, e do lado do cliente criamos um objeto
chamado "Client" que instancia "OlaImpl" e executa o método "showMsg" via RMI.
Veja aqui alguns "screen shots" do Server e do Client rodando em minha máquina:
Server
Client
Essa é uma forma muito utilizada para criar aplicações distribuídas, embora esse artigo
pareça simples, ele demonstra a base para esse tipo de comunicação.
Mais uma vez espero que tenham gostado do artigo e aproveito para agradecer a todos
pelos comentários e o apoio em meus artigos, abraços.
Dayvid
Criando arquivos .jar
Olá a todos, em primeiro lugar gostaria mais uma vez agradecer o apoio, comentários e
críticas de todos vocês.
Nem sempre consigo responder todos os emails e comentários, mas quero que saibam
que todos são lidos e são de grande importância para mim, por tanto muito obrigado.
Muitas pessoas tem me perguntado sobre como trabalhar com arquivos compactados
.jar, pois na maior parte das vezes a nossa aplicação java não se resume apenas a um
arquivo .java, e sim, são compostas de vários arquivos, então como fazer para tornar a
vida mais fácil na hora de um "deploy" ou mesmo no manuseio dos mesmo? A forma
mais fácil é criar um arquivo .jar contendo todos os arquivos do nosso projeto, hoje
veremos como fazer isso utilizando o comando "jar" para criar um pacote "executável"
com os arquivos da nossa aplicação.
Gostaria de dedicar esse artigo ao meus amigos que tem me perguntado sobre
arquivos .jar em especial ao Adriano, foi por causa de suas perguntas que escrevi esse
artigo.
Agora sem mais demora vamos ao que interessa. Para esse artigo iremos precisar de
alguns códigos .java para que possamos gerar o pacote da nossa aplicação, como o
intuito é explicar como gerar o arquivo .jar, os códigos não serão comentados, são
apenas dois códigos simples que escrevi para esta demonstração.
Vamos criar um diretório qualquer para o nosso projeto, eu criei um diretorio chamado
"jarfiles", (que de agora em diante será chamado de diretório RAIZ) e dentro dele
criaremos mais alguns diretórios:
src - diretório onde colocaremos nossos arquivos fonte
bin - diretório onde colocaremos os arquivos compilados
Agora que já temos os diretórios iremos criar duas classes dentro do diretório "src/init",
são elas:
OlaMundo.java
package init;
/**
* @author Dayvid Lima
*/
UsaOlaMundo.java
package init;
/**
* @author Dayvid Lima
*/
Prontinho, agora vamos compilar nossos códigos java para dentro do diretório bin, para
isso uma vez estando dentro do diretório RAIZ no prompt do DOS ou em um terminal
qualquer, vamos digitar:
javac src/init/*.java -d bin/
Isso fará com que os arquivos .java que estão em /src/init/ sejam compilados e
colocados em /bin/init/.
Para ver se está tudo ok iremos rodar nossa aplicação, primeiro entramos no diretório
"bin", e então executamos nossa aplicação com o comando:
java init.UsaOlaMundo
Bom agora que tudo está ok chegou a hora do que realmente interessa, compactar todos
esses arquivos em um único arquivo .jar e rodar a aplicação a partir dele.
Para criar o arquivo .jar iremos fazer uso do comando "jar", existem diversas opções
que podemos passar para o comando jar, iremos nesse artigo fazer uso das seguintes:
c - cria um novo arquivo
v - modo "verbose", mostra na tela o que está acontecendo
f ARQUIVO_JAR - especifica o nome que queremos para o arquivo .jar
m ARQUIVO_DE_MANIFESTO - inclue o arquivo informado como arquivo de
manifesto (veremos isso na segunda parte da explicação)
Ainda dentro do diretório bin, tudo que temos que fazer para criar nosso .jar é executar
o comando:
jar cvf Ola.jar init/*
Pronto, com isso temos nossa aplicação agora dentro do arquivo Ola.jar, vamos então
executá-la, para fazer isso devemos informar no classpath onde está nossa aplicação (no
caso a classe init.UsaOlaMundo),
Podemos tanto colocar o arquivo Ola.jar no nosso classpath quanto informar esse
parâmetro no momento da execução como no comando abaixo:
java -classpath Ola.jar init.UsaOlaMundo
Muito bom, meus parabéns, agora você tem a sua aplicação toda em um arquivo só, pois
bem, vamos facilitar um pouco mais as coisas.
Se olharem dentro do arquivo Ola.jar (abram ele com um compactador qualquer como
Winzip ou Winrar, pois ele é apenas um arquivo compactado sem utilizar compressão,
isso mesmo, você poderia ter simplesmente criado um arquivo .zip ou .rar com o seu
compactador preferido informando a ele para não utilizar compactação, apenas
adicionar os arquivos e depois renomear o mesmo para .jar que ainda assim funcionaria.
Enfim, voltando a aplicação, veja que dentro dele temos um diretório META-INF
contendo o arquivo MANIFEST.MF, pois bem, esse arquivo contém informações sobre
a nossa aplicação, como não criamos esse arquivo, ele tem apenas algumas informações
básica, vamos então criar o nosso MANIFEST.MF e ver em que ele pode nos ajudar.
Quando executamos nossa aplicação vocês se lembram que tivemos que infomar no
classpath o arquivo Ola.jar para que fosse possível rodar a classe "init.UsaOlaMundo",
agora iremos criar um arquivo de manifesto para que seja possível rodar nossa aplicação
informando apenas o arquivo Ola.jar e não mais o nome da classe e pacote
(init.UsaOlaMundo).
Manifest-Version: 1.0
Created-By: Dayvid Lima
Main-Class: init.UsaOlaMundo
O mais importante aqui é a última linha "Main-Class: init.OlaMundo", aqui eu digo qual
classe será chamada quando o arquivo Ola.jar for executado.
Arquivo salvo, estamos prontos para continuar. Dentro do diretório bin vamos apagar o
nosso antigo Ola.jar e criar um novo, agora informando qual arquivo de manifesto que
iremos utilizar,
Para isso basta mudar um pouco nosso comando jar como no exemplo abaixo:
jar cvfm Ola.jar MANIFEST.MF init/*
Dayvid
Conexão via Sockets
Hoje iremos criar uma aplicação dividida em duas partes, uma será um "server" que
ficará "ouvindo" uma porta pré-definida por nós e a outra parte será um "client" que fará
o acesso via sockets nesse servidor para trocar informações.
Esse conceito é muito utilizado para realizar acesso a equipamentos e/ou outros
computadores para troca de informações, tanto utilizando aplicações que utilizam um
"server" próprio quanto aplicações que necessitam acessar um outro tipo de servidor
como por exemplo um servidor de Telnet.
Iremos primeiro criar nosso "server", para esse desenvolvimento estou utilizando o
Eclipse (link para ele no final da matéria), porém podemos criar e rodar essa aplicação
sem a utilização de qualquer IDE, apenas tendo o JDK na máquina.
Server.java
import java.io.*;
import java.net.*;
ServerSocket ss = null;
Socket s = null;
try {
ss = new ServerSocket(this.PORT);
System.out.println("Server on-line na porta: "
+ this.PORT);
while(true){
// espera aqui por algum acesso
s = ss.accept();
System.out.println("usuario conectado");
// tratamentos especiais
// desconecta o client
if(message.equalsIgnoreCase("fim") ||
message.equalsIgnoreCase("shutdown")){
dataOut.writeUTF("bye bye!");
System.out.println("usuario
desconectado");
innet.close();
break;
}
}
if(message.equalsIgnoreCase("shutdown")){
break;
}
}
}
catch(IOException e){
System.out.println("Erro na inicializacao do
server: " + e.getMessage());
}
finally {
try {
if(s != null) s.close();
if(ss != null) ss.close();
}
catch(IOException e){
System.out.println("Erro ao tentar fechar
as conexoes: " + e.getMessage());
}
}
System.out.println("Servidor finalizado!");
}
}
Client.java
import java.io.*;
import java.net.*;
try {
echoSocket = new Socket(this.SERVER_IP,
this.SERVER_PORT);
out = new
PrintWriter(echoSocket.getOutputStream(), true);
in = new BufferedReader(new
InputStreamReader(echoSocket.getInputStream()));
} catch (UnknownHostException e) {
System.err.println("Nao conseguiu achar o
server " + this.SERVER_IP + ": " + e.getMessage());
System.exit(1);
} catch (IOException e) {
System.err.println("Nao conseguiu abrir a
conexao com o server " + this.SERVER_IP + ": " +
e.getMessage());
System.exit(1);
} finally {
try {
if(stdIn != null) stdIn.close();
if(in != null) in.close();
if(out != null) out.close();
if(echoSocket != null) echoSocket.close();
} catch (IOException e) {
System.err.println("erro ao tentar fechar
as conexoes: " + e.getMessage());
System.exit(1);
}
}
}
}
Entendendo o funcionamento:
O Server:
O que o server faz é ficar "ouvindo" uma determinada porta (no nosso caso a porta
5050), receber tudo que for informado nessa porta e mostrar na tela.
Para isso temos alguns passos básicos:
1 - importar os pacotes necessários para se trabalhar com sockets
2 - definir a porta que queremos "ouvir"
3 - criar a conexão (começar a "ouvir")
4 - mostrar na tela tudo que conseguir capturar pela porta que estamos "ouvindo"
Com eles temos os componentes necessários para criação de um servidor socket, para o
tráfego de dados desse servidor e para os tratamentos de erros (exceptions).
Aqui definimos qual porta queremos que o nosso server fique "ouvindo".
private final int PORT = 5050;
Agora criamos a conexão em sim, é aqui que ele começa a "ouvir" essa porta:
ss = new ServerSocket(this.PORT);
Assim que ele receber uma conexão na porta que ele está "ouvindo" ele cria um canal de
comunicação com quem acessou essa porta:
out = s.getOutputStream();
dataOut = new DataOutputStream(out);
Caso a mensagem enviada seja "FIM" ele desconecta o client, e caso a mensagem seja
"SHUTDOWN" ele desconecta o client e para o server.
if(message.equalsIgnoreCase("fim") ||
message.equalsIgnoreCase("shutdown")){
dataOut.writeUTF("bye bye!");
System.out.println("usuario desconectado");
innet.close();
break;
}
Caso a mensagem enviada seja "shutdown" devemos sair também do while(true) por
isso temos esse outro if:
if(message.equalsIgnoreCase("shutdown")){
break;
}
O Client:
Com eles temos os componentes necessários para fazer a conexão via sockets com
algum servidor, trocar mensagens com o mesmo e para os tratamentos de erros
(exceptions).
Aqui temos duas contantes onde definimos o IP de onde vai estar o server e a porta que
mandamos o server ficar "ouvindo", caso o server esteja na sua própria máquina você
pode deixar o IP como "127.0.0.1".
Fazendo funcionar:
Existem diversas formas de compilar e rodar o programa mostrado aqui, segue abaixo
os passos para rodar a partir da linha de comando do DOS:
1 - Abra duas janelas (dois prompts) do DOS e entre no diretório onde você compilou
os arquivos
2 - Na primeira janela você deve executar o Server com o comando: java Server
3 - Na segunda janela você deve executar o Client com o comando: java Client
Agora tudo que for digitado no Client será recebido pelo Server e mostrado na janela do
server.
Você pode rodar o Server em uma máquina e o Client em outra, basta para isso colocar
no Client o endereço IP da máquina onde o Server está rodando. Também é possível
utilizar outra porta para a comunicação;
Veja aqui alguns "screen shots" do Server e do Client rodando em minha máquina:
Server rodando
A adoção do uso de tipos genéricos em Java levou muito tempo acredito que pelo
fato da possibilidade de realização de "casting", porém quem nunca se deparou
com uma "ClassCastException" quando acidentalmente tentou realizar um "casting"
para o tipo errado.
Com tipos genéricos através de parametrização a verificação do "casting" é
realizada no momento da compilação, o que torna mais fácil a vida do
programador.
Iremos criar duas classes, a primeira "Obj" contém dois métodos (add e get) que
recebem e retornam um tipo "Integer".
private Integer i;
No caso acima, somente é possível colocar em Obj um objeto do tipo Integer, agora
veremos como tipos genéricos pode nos ajudar quando queremos colocar um
Integer ou uma String na classe Obj por exemplo.
Vamos recriar o cenário anterior com a utilização de tipos genéricos.
Veja que agora o tipo de objeto que será armazenado é representado pela letra T,
que também deverá ser informado quando uma instância de Obj for criada.
Criaremos agora uma classe chamada Programa que implementa Runnable e utiliza
o ObjMin.
Existe ainda algumas aplicações para Generics que não abordei nesse artigo para
não torna-lo muito extenso e chato de ler, a idéia aqui é dar uma pequena amostra
de como funciona.
A utilização de "tipos genéricos" vêm sendo adotada cada vez mais pelos
programadores java, também é possível aplicar "tipos genéricos" em interfaces,
mas uma de suas maiores aplicações (pelo que vi nos trabalhos que realizei) é na
manipulação de lista de objetos.
Espero que este artigo venha a sanar as dúvidas de quem ainda não utilizou "tipos
genéricos" e/ou não conhecia.
Todos os exemplos utilizados aqui estão para download, também inclui um link do
site da Sun onde é possível buscar mais informações sobre os "tipos genéricos"
(Generics).