2011-08-17 23 views
5

tengo tres interfaces genéricas (con una relación inversas entre dos de ellos) y quiero procesarlos en un método recursivo:Trabajar con Recursión y genéricos Interfaces

public interface User<R extends Role<R,U>, U extends User<R,U>> 
{ 
    public R getRole(); 
    public void setRole(R role); 
} 

public interface Role<R extends Role<R,U>,U extends User<R,U>> 
{ 
    public List<R> getRoles(); 
    public void setRoles(List<R> roles); 

    public List<U> getUser() ; 
    public void setUser(List<U> user); 
} 

Ahora quiero hacer algo de procesamiento con una recursividad en mi clase Worker:

public <R extends Role<R,U>,U extends User<R,U>> void recursion(List<R> roles) 
{ 
    for(R role : roles) 
    { 
    recursion(role.getRoles()); 
    } 
} 

consigo este error y estoy no descubierto por qué esto no funciona o cómo puedo solucionar esto:

Bound mismatch: The generic method recursion(List<R>) of type Worker is not 
applicable for the arguments (List<R>). The inferred type User<R,User<R,U>> 
is not a valid substitute for the bounded parameter <U extends User<R,U>> 

Respuesta

2

Lo modifiqué, sin usar comodines genéricos ?, por lo que se compila.
Después de despojar a declaraciones de métodos irrelevantes para el problema:

public interface Role<R extends Role<R, U>, U extends User<R, U>> { 
    public List<Role<R, U>> getRoles(); // Change here to return type 
} 

public interface User<R extends Role<R, U>, U extends User<R, U>> { // No change 
} 

// Change to method parameter type 
public static <R extends Role<R, U>, U extends User<R, U>> void recursion(List<Role<R, U>> roles) { 
    for (Role<R, U> role : roles) { // Change to element type 
     recursion(role.getRoles()); 
    } 
} 

Espero que estos cambios todavía caben su diseño - quiero saber si no trabajan para usted y voy a tratar de solucionar sus necesidades.

¡Uf! ¡Una dificil!

+0

estoy seguro acerca de la implicación de cambiar el método de interfaz para 'Role'. Supongo que devuelve una Lista de la interfaz de 'Role'. Estoy usando las interfaces para algunas implementaciones de '@ Entity'. El método recursivo se usa en una clase de utilidad, quizás la propuesta de comodín '?' De dacwe sea adecuada para mí. – Thor

2

Como habrás notado, necesitas especificar el tipo U en uno de los argumentos. Puede hacerlo o si desea ignorar el tipo U puede utilizar en lugar ?:

public <R extends Role<R,?>> void recursion(List<R> roles) 
{ 
    for(R role : roles) 
    { 
    recursion(role.getRoles()); 
    } 
} 
+0

Gracias, esta puede ser una solución para mi problema. Pero normalmente solo uso el comodín '?' Si realmente no sé el tipo. Aquí estoy seguro de que es del tipo 'U'. – Thor

+0

Luego podría pasar otro parámetro con ese "tipo de información", por ejemplo: '... recursión (Lista roles, Clase userClass)' (e ignore el parámetro) .. – dacwe