Generics: Informações a respeito do atributo[Resolvido]

4 respostas
Mantu

Olá pessoal!
Estou estudando generics e criei um método cujo intuito é obter um String que liste os elementos de um Iterable:

public static <T>String toString(Iterable<T> iterable, String separator){
		if(iterable == null || separator == null)
			return null;
		
		StringBuilder sb = new StringBuilder("");
		for(Iterator<T> it = iterable.iterator(); it.hasNext();) {
			sb.append(it.next());
			if(it.hasNext())
				sb.append(separator);
		}
		return sb.toString();
	}

Não sei se está legal esse método, pois como disse, estou estudando generics. Minha dúvida é a seguinte: Existe algum meio de, dentro deste método, eu saber se T é um Iterable (se o parâmetro iterable é um Iterable)?
Valeu!

4 Respostas

T
public static <T>String toString(Iterable<T> iterable, String separator){
 		if(iterable == null || separator == null)
 			return null;
 		
 		StringBuilder sb = new StringBuilder("");
 		for(Iterator<T> it = iterable.iterator(); it.hasNext();) {
 			sb.append(it.next());
 			if(it.hasNext())
 				sb.append(separator);
 		}
 		return sb.toString();
 	}

A resposta simples é “não” (Veja o conceito de “erasure”).

Se precisar do tipo T,você precisa passá-lo explicitamente:

public static <T>String toString(Iterable<T> iterable, Class<T> klass, String separator)...
Mantu

Então não teria como utilizar generics pra bolar uma estratégia para criar esse String, detalhando elementos de Iterables aninhados???

Mantu

Bom, o melhor que consegui foi assim…

public static <T>String toDeepString(T[] array , String separator){
		return toDeepString(Arrays.asList(array), separator);
	}
	public static <T>String toDeepString(Iterable<T> iterable, String separator){
		if(iterable == null || separator == null)
			return null;
		
		StringBuilder sb = new StringBuilder("");
		for(Iterator<T> it = iterable.iterator(); it.hasNext();) {
			T elem = it.next();
			if(elem instanceof Iterable<?>)
				sb.append(toDeepString((Iterable<?>)elem, separator));
			else if(elem.getClass().getComponentType() != null)
				sb.append(toDeepString((Object[])elem, separator));
			else
				sb.append(elem);
			
			if(it.hasNext())
				sb.append(separator);
		}
		return sb.toString();
	}

Mas não funciona para vetores de tipos primitivos…
Que chato! :frowning:

T

Para tipos primitivos não tem muito jeito (pra começar T não pode ser um tipo primitivo.)

Criado 28 de novembro de 2006
Ultima resposta 28 de nov. de 2006
Respostas 4
Participantes 2