Bom pessoal, estou tendo um problema com tipologia … e esta dificil de resolver, se alguem puder por favor me ajuda…
eu tenho um método, que tem 2 parametros… o 1° tem que ser uma classe do tipo T onde T assina IEntitySignature, e o segundo parametro é uma coleção de tipo também T … é imperativo, que tanto a classe como a coleção sejam da mesma entidade. Este método é parte dum repositorio de entidades, que persiste o banco de dados.
[code] public <E extends IEntitySignature> boolean contaisAll(Class<E> entityClass,Collection<E> entitys) {
return DataBase.getCurrentEntityRepository(entityClass).contaisAll(entitys);
}
//…
//Exemplo de uso:
Collection<Aluno> alunos = getListaParticularDeAlunosX();
boolean thisListIsPersistent = contaisAll(Aluno.class,alunos);[/code]
eu tenho 1 objeto, que guarda coleções de entidades… esse objeto é um manager, que organiza bem direitinho as coleções… ele separa as entidades por suas classes, em coleções internas…
Neste objeto os métodos relevantes ao meu problema são
1°) método que retorna um Iterator de classes, que são as classes das entidades… todas as classes deste iterator assinam a interface IEntitySignature
2°) método que retorna uma coleção de entidades de uma classe especifica… todas as entidades da coleção são do mesmo tipo da classe enviada
3°) método que adciona uma entidade ao manage… ele internamente busca a coleção da classe q a entidade pertence, e a coloca nesta coleção.
[code] public Iterator<Class<? extends IEntitySignature>> getEntityClasses() {
return collectionManager.keySet().iterator();
}
public <T extends IEntitySignature> Collection<T> getEntityCollection(Class<T> forThisClass) {
return (Collection<T>)collectionManager.get(forThisClass);
}
public void addEntity(IEntitySignature entity) {
if (!contaisCollectionFor(entity)) createCollectionFor(entity);
getCollection(entity).add(entity);
}
//exemplo de uso (dentro do objeto, só existe 1 coleção para cada tipo de classe)
//…
objManager.addEntity(aluno1); //adciona na coleção de alunos.
objManager.addEntity(curso1); //adciona na coleção de cursos.
objManager.addEntity(aluno2); //adciona na coleção de alunos.
objManager.addEntity(aluno4); //adciona na coleção de alunos.
//Percorre a lista de coleções
for (Class classe: objManager.getEntityClasses() {
System.out.println(“Os “+ classe.getName() +” são:”);
//Percorre cada entidade dentro da coleção
for (Object entity : getEntityCollection(classe) ) {
System.out.println(entity.toString());
}
}
//o resultado do console será:
/**
Os model.entity.Aluno são:
João da silva
João dos santos
José da silva
Os model.entity.Curso são:
Ciências da computação
*/
[/code]
Bom meu problema esta no seguinte uso, estou implementado no repositorio um método, que pega um Manage destes de coleções…
Verifica quais classes ele contem… e manda cada coleção de cada classe para seu devido método…
Ele deveria funcionar assim
1 - pegar a lista de classes contidas no manager (são Keys para buscar as coleções)
2 - Para cada uma das chaves fazer o seguinte
. 2.1 - buscar a coleção daquela calsse
. 2.2 - testar se existe cada uma das coleções usando do repositorio contaisAll(classe,collection)
. 2.3 - se qualquer coleção retornar false através do contaisAll(classe,collection), parar o loop, e retornar que false.
3 - retornar verdade caso todas as coleções estiverem continas no repositorio.
Meu problema é o seguinte… getEntityClasses(); retorna apenas classes que implementam IEntitySignature
se eu fizer getEntityCollection(classe) de qualquer uma das classes vou objetar a sua coleção… porem! não consigo pegar a lista, de classes, percorrer a lista, e mandar a coleção para cada containsAll() … ele fala que os tipos não são compativeis…
public boolean contaisAll(EntityCollectionManager manager) {
boolean contais = false;
Iterator<Class><? extends IEntitySignature>> entityClassList = manager.getEntityClasses();
boolean moreTeste = entityClassList.hasNext();
while(moreTeste) {
Class<? extends IEntitySignature> entityClass = entityClassList.next();
contais = contaisAll(entityClass, manager.getEntityCollection(entityClass));
//se não contiver a coleção, ou se não houver mais listas ele sai do loop
moreTeste = contais && entityClassList.hasNext();
}
return contais;
}
O problema esta que… contaisAll(entityClass, manager.getEntityCollection(entityClass)); não é acieto pelo compilador…
Ele normalmente deveria aceitar… visto que contaisAll(Class<T>,Collection<T> ) exige classe e coleção do mesmo tipo, o que é verdade
quando faço manager.getEntityCollection(entityClass) recebo uma coleção do mesmo tipo de entityClass…
a unica falha esta em…"entityClass" é do tipo <? extends IEntitySignature> ou seja… é um tipo generico… invalidado a operação…
Eu não tenho como saber qual classe ta vindo, a não ser em tempo de execução… não sei como fazer um caster… sem saber exatamente qual classe vai vim…
Alguem me ajuda plix!!!
