To meio enrolado com um problema. Tenho uma classe DTOBase, da qual derivo varios outras. Preciso de um metodo que crie
uma DTO qualquer a partir da classe, que obtenho por reflexao. So´consegui usando cast e supressWarning, mas nao me agradou.
Tenho um metodo que retorna a classe de um determinado DTO
Funciona, mas tenho que fazer o cast (T) e usar SuppressWarnings(“unchecked”)
Quando nao uso, vem essa msg de erro em factory :
required: T
found: CAP#1
where T is a type-variable:
T extends DTOBase declared in method factory(String)
where CAP#1 is a fresh type-variable:
CAP#1 extends DTOBase from capture of ? extends DTOBase
Já notei que tem a ver com o retorno de asSubclass que e´ Class< ? extends DTOBase> e nao Class
Queria uma maneira melhor de fazer funcionar, sem usar cast e supressWarning. Alguma ideia ?
Não faça isso colega, seu tópico não é mais importante que os outros.
Seu método não está lançando exceção demais? O método factory lança até mesmo uma SQLException, quando vai ocorrer isso ali?
E outra, não gostei do seu método getDTOClass, você tem um bloco finally com um retorno, que isso?
Claro que funciona e pode ser usado assim, mas não acho uma boa prática.
Outro detalhe é que não sei se você precisa de outro método, como o getDTOClass, pode fazer tudo no factory, o método vai ficar bem curto.
A não ser que tu use o método getDTOClass em mais locais. É normal realizar o cast, você trabalha com Objetos e não um tipo genérico quando cria uma instância, isso acontece.
Vou ver se depois pego seu código e consigo melhora-lo, mas a principio não vejo problemas, até porque funciona.
Desculpe, nao frequento muito esse forum, por isso nao conhecia as regras aqui. Tambem nao pego em java a algum tempo.
A getDTOClass precisa ficar separada, pois e’ usada em outros lugares.
O metodo getClassName faz chamadas JDBC, por isso propaga SQLexception
Mas concordo que esta’ bem poluido, por isso fiz as modificacoes abaixo
@SuppressWarnings("unchecked")
public static <T extends DTOBase> Class<T> getDTOClass(String typeName)
{
try
{ String className = getClassName(typeName);
return (Class<T>) Class.forName(sb.toString()).asSubclass(DTOBase.class);
}
catch (Exception e) {
//e.printStackTrace(); recolocar depois que todas as DTOs estiverem implementadas
return null;
}
}
Funciona, so’ queria saber se havia outro modo de resolver, sem usar cast e @SuppressWarning.
Na definição do método subClass ele informa que é obrigatório o Cast e gera o warning pois não é possível verificar o tipo generico em tempo de execução.
Se seria className e não sb.toString() ali né?
Abraços.