Quem puder ajudar, enrolado com reflection e generic

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

@SuppressWarnings("unchecked")
	public static <T extends DTOBase> Class<T> getDTOClass(String typeName)
	{
		Class<T> dtoClass = null;
		try
		{	String className = getClassName(typeName);
			dtoClass = (Class<T>) Class.forName(className).asSubclass(DTOBase.class);
		}
		catch (Exception e) {
			e.printStackTrace(); 
    	}
    	finally {
    		return dtoClass;
		}
	}

Entao tenho um metodo que cria uma DTO

	@SuppressWarnings("unchecked")
	public static <T extends DTOBase > T factory (String typeName)
		throws InstantiationException, IllegalAccessException, InvocationTargetException, SQLException
	{
		return (T) getDTOClass(typeName).newInstance();
	}

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 ?

up

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.

Sem problemas.

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é? :slight_smile:
Abraços.

Sim, e’ className mesmo, ja’ tinha corrigido aqui

Imaginei que o cast era necessario, entao que seja :slight_smile:
Obrigado

abraco