2010-06-22 20 views
9

tengo las siguientes clases abstractas:genéricos de Java y la herencia

public abstract class AbSuperClass1<K,S> { 
    //class definition 
} 

y:

public abstract class AbSuperClass2<K,S> { 
    public abstract <Q extends AbSuperClass1<K,S>> void method(Q arg); 
    ... 
} 

Entonces tengo dos implementaciones concretas

public class Concrete1 extends AbSuperClass<String, String>{ 
    //class definition 
} 

y:

public class Concrete2 extends AbSuperClass2<String, String>{ 
    public void method(Concrete1 arg){ 
     //method definition 
    } 
} 

Sin embargo, esto no compilará, ya que Concrete1 no se reconoce como un tipo válido para el argumento de método en Concrete2, pero por lo que puedo ver Concrete1 es del tipo correcto, ya que amplía AbSuperClass1.

¿Dónde me estoy equivocando?

+1

Si es posible, sugiero usar Eclipse como entorno para escribir su código Java. Eclipse le habría mostrado exactamente lo que estaba mal y proporcionó un menú desplegable para que agregue la función que falta con un clic del mouse. Este tipo de capacidad puede acelerar significativamente su curva de aprendizaje y el tiempo de desarrollo. –

+2

'public abstract > void method (Q arg);' es el equivalente de 'public void open method (AbSuperClass1 arg);'. –

Respuesta

3

Eclipse propuso añadir este método:

@Override 
public <Q extends AbSuperClass1<String, String>> void method(Q arg) { 
    // TODO Auto-generated method stub 

} 

Otra cosa que puede hacer, es añadir este parámetro Tipo de la clase:

abstract class AbSuperClass2<K,S, Q extends AbSuperClass1<K,S>> { 
    public abstract void method(Q arg); 
} 

y

class Concrete2 extends AbSuperClass2<String, String, Concrete1> { 
    public void method(Concrete1 arg) { 
     //method definition 
    } 
} 
5

consideran este programa :

public class OtherConcrete extends AbSuperClass<String, String> {} 

AbSuperClass2<String, String> x = new Concrete2(); 
x.method(new OtherConcrete()); 

¿Qué esperarías que hiciera? Ha redefinido el método en términos de proporcionar una implementación para un subtipo específico de AbSuperClass<String, String> - pero no ha proporcionado una implementación que pueda hacer frente a cualquieraAbSuperClass<String, String>, que es lo que se requiere.

Es difícil sugerir un curso de acción particular sin conocer los detalles de la situación. La sugerencia de Bozho de agregar otro parámetro de tipo, que le permita hacer la declaración method más específica, es una buena ... pero todo se está volviendo muy complicado. Si puede resolver de alguna forma la cantidad de funkiness genérico que está sucediendo, los mantenedores de su código probablemente se lo agradecerán.