Generics

2 respostas
java
L

Boa noite, tenho estudo java a alguns meses e confesso estar adorando gastar um bom tempo aprendendo cada vez mais sobre a linguagem. Mas no momento me encontro com uma dificuldade para entender um conceito talvez básico de POO que são os Generics, Principalmente por sua escrita. Enfim vamos ao Código:

//Se trata de um código de um livro o qual venho estudado.
package Genericos;

import java.util.Arrays;

public class MaiorGen {

public static void main(String[] args) {
	Integer aI[]={-2,4,7,10,8,5,1,-1};
	Double aD[]={-2.6,4.4,7.8,9.5,8.6,5.7,1.3,-1.9};
	System.out.println("Maior Interger"+maior(aI)+" de "+ Arrays.toString(aI));
	System.out.println("Maior Double"+maior(aD)+" de "+Arrays.toString(aD));
	
}
@SuppressWarnings
public static <T extends Comparable > T maior (T array[]){
	T maior = array[0];
	for (T elemento: array){
		if (maior.compareTo(elemento)>0)maior=elemento;
		return maior;
	}
}

}

Meu problema começá na leitura do método da 15 linha. E em seu entendimento.
Pelo que entendi o Método estático retorna um tipo T que implemente a interface Comparable, o nome do método é maior, porem não entendo o “T” antes de maior e nem porque na linha seguinte surge aparentemente um objeto chamado “T maior” que recebe o array 0. Se eu estiver muito atrasado me sugiram algum material ou texto sobre essa matéria.
Grato desde ja.

2 Respostas

TalonNoxus

O T seria uma classe, nesse exemplo qualquer classe que herde de Comparable.

Quando você quer percorrer um array de String, você faz assim: for(String string : array){}. Nesse exemplo é praticamente a mesma coisa, só que você não sabe que tipo você vai percorrer.

Se você soubesse qual classe você ia receber e/ou retornar, você não precisaria de usar Generics, mas nesse seu exercício tem dois arrays um de cada tipo, que são: Integer e Double.

E também ao invés de criar dois métodos, cada um recebendo um tipo diferente por parâmetro e retorno, você apenas cria um método para os dois.

O T seria como o X na matematica, você sabe que tem um valor(tipo), mas não sabe qual.

O T maior é uma variavel de um tipo qualquer(no seu caso só pode ser Integer ou Double), que recebe o valor de array[0],

Ao invés de fazer um if checando se o tipo é Integer ou Double para poder criar uma variável nova com o mesmo tipo, você usa Generics.

Obs: Pode ser qualquer letrar, mas o T é uma convenção.

wldomiciano

T é uma variável como qualquer outra, ela é chamada de Type Variable, só que ao invés de armazenar um valor primitivo ou uma referencia a um objeto, ela armazena um tipo e, no caso, este tipo pode ser qualquer um que implemente Comparable.

Como qualquer váriavel, uma Type Variable precisa ser declarada antes de poder ser usada. Então, na parte <T extends Comparable> você não está definindo o tipo de retorno do seu método, na verdade você está declarando uma Type Variable cujo nome é T e especificando que ela poderá representar qualquer tipo contanto que este tipo implemente Comparable.

O T antes do nome do método sim é o tipo que ele retorna. Que tipo é este? Não saberemos até que o tal método seja invocado, apenas sabemos que este tipo deve implementar Comparable.

Criado 21 de fevereiro de 2017
Ultima resposta 21 de fev. de 2017
Respostas 2
Participantes 3