Generic Methods

voltar

 
 

Exemplo 1)

Neste exemplo é ilustrado a declaração de um método genérico sem que a classe toda seja declarada genérica.

 
 

import java.util.*;

 
 

class Dog{

@Override

public String toString() {

return “dog au au”;

}

}

 
 

class CreateAnArrayList {

// take an object of an unknown type and use a “T” to represent the type

public <T> List<T> makeArrayList(T t) {

List<T> list = new ArrayList<T>(); // now we can create the list using “T”

list.add(t);

return list;

}

}

 
 

 
 

public class GenTest {

public static void main(String[] args) {

CreateAnArrayList c = new CreateAnArrayList();

List<Integer> intlst;

List<String> strlst;

List<Dog> doglst;

 
 

intlst = c.makeArrayList(new Integer(1));

strlst = c.makeArrayList(new String(“pedro abs”));

doglst = c.makeArrayList(new Dog());

 
 

for (Integer i: intlst){

System.out.println(i);

}

for(String s:strlst){

System.out.println(s);

}

for (Dog dog : doglst) {

System.out.println(dog);

}

}

}

 
 

Output:

1

pedro abs

dog au au

 
 

___________________________________________________________________________________________________

 
 

Exemplo 2)

 
 

Neste exemplo é ilustrado como é possível restringir a declaração de uma classe genérica a uma hierarquia na cadeia de herança.

Atenção, o correto é <T extends Number> e não <? Extends Number>

 
 

 
 

class NumberHolder<T extends Number>{

private T aNumber;

public NumberHolder(T aNumber){

this.aNumber = aNumber;

}

public T getNumber(){

return aNumber;

}

@Override

public String toString() {

return aNumber.getClass().getSimpleName() + “: ” + aNumber;

}

}

 
 

 
 

public class GenTest2 {

public static void main(String args[]){

NumberHolder<Integer> nh1 = new NumberHolder<Integer>(1);

System.out.println(nh1);

 
 

NumberHolder nh2 = new NumberHolder(2.0);

System.out.println(nh2);

 
 

NumberHolder<Float> nh3 = new NumberHolder<Float>(1.5F);

System.out.println(nh3);

}

}

Output:

Integer: 1

Double: 2.0

Float: 1.5

 
 

 
 

Veja abaixo que ao tentar passar uma String para o tipo genérico é gerado um erro de compilação, pois a classe é

<T extends Number>.

 
 

public class GenTest2 {

public static void main(String args[]){

//Não compila:

NumberHolder<String> nh2 = new NumberHolder<String>(“um”);

}

}

Output:

Exception in thread “main” java.lang.Error: Unresolved compilation problems:

Bound mismatch: The type String is not a valid substitute for the bounded parameter <T extends Number> of the type NumberHolder<T>

Bound mismatch: The type String is not a valid substitute for the bounded parameter <T extends Number> of the type NumberHolder<T>

 
 

at GenTest2.main(GenTest2.java:5)

 
 

 
 

___________________________________________________________________________________________________

 
 

Exemplo 3)

 
 

Aqui produzimos uma classe que herda da nossa NumberHolder e também declara generics, porém sem nenhuma restrição na cadeia de herança.

 
 

class NumberHolder<T> {

private T aNumber;

public NumberHolder(T aNumber) {

this.aNumber = aNumber;

}

public T getNumber() {

return aNumber;

}

@Override

public String toString() {

return aNumber.getClass().getSimpleName() + “: ” + aNumber;

}

}

 
 

class IntegerHolder <T> extends NumberHolder {

public IntegerHolder(T aNumber) {

super(aNumber);

}

}

 
 

public class GenTest2 {

public static void main(String args[]) {

NumberHolder<? extends Number> nh1 = new IntegerHolder(1);

System.out.println(nh1);

 
 

NumberHolder<Integer> nh2 = new IntegerHolder<Integer>(2);

System.out.println(nh2);

}

}

Output:

Integer: 1

Integer: 2

 
 

___________________________________________________________________________________________________

 
 

Exemplo 4)

 
 

Aqui a nossa classe IntegerHolder já apresenta a restrição em sua declaração genérica <T extends Integer> conforme pode-se ver abaixo.

 
 

class NumberHolder<T> {

private T aNumber;

public NumberHolder(T aNumber) {

this.aNumber = aNumber;

}

public T getNumber() {

return aNumber;

}

@Override

public String toString() {

return aNumber.getClass().getSimpleName() + “: ” + aNumber;

}

}

 
 

class IntegerHolder <T extends Integer> extends NumberHolder {

public IntegerHolder(T aNumber) {

super(aNumber);

}

}

 
 

public class GenTest2 {

public static void main(String args[]) {

NumberHolder<? extends Number> nh1 = new IntegerHolder(1);

System.out.println(nh1);

 
 

NumberHolder<Integer> nh2 = new IntegerHolder<Integer>(2);

System.out.println(nh2);

 
 

NumberHolder<Double> nh3 = new NumberHolder<Double>(2.0);

System.out.println(nh3);

 
 

NumberHolder<Double> nh4 = new IntegerHolder<Double>(2.0);

System.out.println(nh4);

}

}

Output:

Integer: 1

Integer: 2

Double: 2.0

 
 

Exception in thread “main” java.lang.Error: Unresolved compilation problem:

Bound mismatch: The type Double is not a valid substitute for the bounded parameter <T extends Integer> of the type IntegerHolder<T>

 
 

 
 

 
 

 
 

Esta entrada foi publicada em Generics com as etiquetas . ligação permanente.

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s