Função genérica Java: como devolver o tipo genérico
Aqui está um padrão genérico de Java:
public <T> T getResultData(Class<T> resultClass, other_args) {
...
return resultClass.cast(T-thing);
}
Uma chamada típica se parece com:
DoubleBuffer buffer;
buffer = thing.getResultData(DoubleBuffer.class, args);
Eu nunca fui capaz de descobrir como usar esse padrão de forma limpa quando o tipo de retorno desejado é, em si, genérico. Para ser 'concreto', e se uma função como essa quiser retornarMap<String,String>
? Desde que você não pode obter um objeto de classe para um genérico, é claro, a única opção seria passarMap.class
, e então você precisa de um elenco e um@SuppressWarning
depois de tudo.
Um acaba com uma chamada como:
Map<String, String> returnedMap;
returnedMap = thing.getResultData(Map.class, some_other_args);
Agora, voltamos a precisar de elencos e suprimir um aviso.
Eu suponho que alguém poderia pegar algo dojava.lang.reflect.Type
família em vez doClass
, mas esses não são especialmente fáceis de inventar. Isso parece:
class Dummy {
Map<String, String> field;
}
...
Type typeObject = Dummy.class.getField("field").getGenericType();
Diante disso, a função chamada poderia extrair o tipo base e usá-la para lançar ou newInstance-ing, mas o negócio de campo fictício certamente parece feio.
Observe que funções como essa nem sempre estão chamandonewInstance
. Obviamente, se eles fazem, eles não precisam ligarresultClass.cast
.