2009-06-07 15 views
5

Tengo las siguientes clases de preparación:Java genéricos, genéricos extendidas y las clases abstractas

public abstract class Process<T,S> { 
    ... 
} 

public abstract class Resource<T, S extends Process<T, S>> { 
    protected S processer; 
    ... 
} 

public class ProcessImpl<EventType1, EventType2> { 
    ... 
} 

public class ResourceImpl extends Resource<EventType1, ProcessImpl> { 
    processer = new ProcesserImpl(); 
    ... 
} 

Todo está bien hasta que llegue a la ResourceImpl. Me dijeron que ProcessImpl no es un sustituto válido para el parámetro <S extends Process<T,S>> delimitado del tipo Resource<T,S>.

He intentado varias formas de evitar esto y seguir golpeando una pared.

¿Alguien tiene alguna idea?

Respuesta

11
public class ProcessImpl<EventType1, EventType2> { 
... 
} 

Debido ProcessImpl no extender proceso. Su ProcessImpl no se deriva de Process, que es lo que está declarando que debería ser ese parámetro.

0

No veo la manera de editar la versión original o comentar las respuestas dadas sin una mejor reputación.

Este código existirá en una capa web, el eventtype2 se define en la capa de persistencia y solo se puede acceder a él en la capa central que existe debajo de este nivel.

Desafortunadamente, sin tener un acoplamiento ajustado, lo cual me gustaría evitar, no tengo acceso a EventType2.

+0

No entiendo. ¿No puede hacer que ProcessImpl se extienda desde Process? –

1

Es posible que desee hacer algo como esto:

public abstract class Process<T, S> { 
} 

public abstract class Resource<T, S extends Process<T, S>> { 
    S processor; 

} 

public class ProcessImpl extends Process<EventType1, ProcessImpl> { 
} 

public class ResourceImpl extends Resource<EventType1, ProcessImpl> { 

} 

Si la restringirá el parámetro S del Resource a ser un procesador también tiene que declarar adecuadamente en la clase ProcessImpl. No sé qué es EventType2, pero debería estar implementando la interfaz del proceso. Supuse que en realidad quieres decir ProcessImpl.

0

Si no desea que su código dependa de algún paquete existente, que contiene el Process, también podría presentar algún paquete de interfaz nuevo en función de nada en la parte inferior de la jerarquía de clases. (Si puede cambiar las restricciones de la herencia, por supuesto.)