The shortest post I have ever written to this web based virtual diary also known as an weblog or blog for short.
My current favorite band: Violent Femmes. Check it out.
My current favorite band: Violent Femmes. Check it out.
Posted by
Rafael Ferreira
at
8:14 PM
0
comments
Há um tempinho eu postei aqui uma dica que deveria facilitar a construção de listas e maps em Java. A idéia básica era escrever uma classe utilitária com métodos estáticos usando varargs e genéricos que depois seriam importados (via static imports) nas classes clientes. Algo assim:
public class CollectionUtils {
public static List listWith(T... elements) {
return Arrays.asList(elements);
}
...
}
Isso até que funciona direto, mas não posso dizer o mesmo sobre a implementação do mapWith. Este método retorna um java.util.Map criado a partir de uma série de pares chave-valor. Cada par é representado por um objeto da classe Map.Entry<K,V> criado usando outro método estático. Assim um uso do mapWih poderia ser:
Map<NumeroNatural, String> numeros = mapWith(pair(ZERO, "0"), pair(ONE, "1"));
Para programar o mapWith eu usei o mesmo truque do listWith, receber os argumentos (os pares) via varargs:
public static <K, V> Map<K, V> mapWith(Map.Entry<K, V>... entries) {
HashMap<K, V> map = new HashMap<K, V>();
for (Map.Entry<K, V> eachEntry : entries)
map.put(eachEntry.getKey(), eachEntry.getValue());
return map;
}
Essa definição de método compila normalmente, mas todas as chamadas à ele receberão um warning do compilador avisando que um array genérico está sendo criado. "Huh? Mas eu não estou criando porcaria de array nenhum!", foi o que eu respondi para o compilador. Depois de me assegurar que ninguém me viu conversando com o javac.exe, que aliás é um interlocutor bem antipático, pesquisei um pouco e descobri que varargs no Java 5 usa arrays por baixo do pano. "Ok, mas qual é o problema de criar um array de tipo genérico?". Bom, vamos por partes, como diria o Leibniz. Primeiro precisamos lembrar que arrays são covariantes no tipo do seu elemento; veja:
String[] sa = new String[10];
Object[] oa = sa;
oa[0] = new Integer(5);
Class<String>[] ca = new Class<String>[10];
Object[] oa = ca;
ca[0] = new Integer(8);
Posted by
Rafael Ferreira
at
2:14 AM
2
comments