Tengo un superclase con el método:

protected <E extends Enum<E>,T extends VO> void processarRelatorioComEstado(Date dataInicial, Date dataFinal, E estado) throws RelatorioException {

    throw new UnsupportedOperationException("method not overridden");
}

y en una de sus subclases quiero hacer lo siguiente:

    @Override
protected <E extends Enum<E>> DemonstrativoReceitaDespesasAnexo12Vo processarRelatorioComEstado(Date dataInicial, Date dataFinal, E estado) throws RelatorioException {
//do something
return DemonstrativoReceitaDespesasAnexo12Vo;
}

pero esto simplemente no funciona. El problema es que tengo una referencia a una superclase, y quiero llamar a este método, pero sólo en una de las subclases.

No es primordial si la firma es diferente.

OriginalEl autor danillosl | 2013-09-12

3 Comentarios

  1. 4

    Usted no puede cambiar el número de parámetros de tipo en el método reemplazado. En cuanto a tu caso, anular claramente no con el tipo de retorno. Pero incluso si los tipos de devolución fueron del mismo, su método aún así no sería reemplazar equivalente, como tiene menos parámetros de tipo en el supuesto-a-ser reemplazado método.

    De JLS – Método de Firma:

    Dos métodos tienen la misma firma si tienen el mismo nombre y
    tipos de argumento.

    Dos método o constructor declaraciones de M y N tienen el mismo argumento
    tipos si todas las siguientes condiciones:

    • Tienen el mismo número de parámetros formales (posiblemente cero)
    • Tienen la mismo número de parámetros de tipo (posiblemente cero)

    Por lo tanto, incluso el código siguiente error:

    interface Demo {
        public <S, T> void show();
    }
    
    class DemoImpl implements Demo {
        @Override
        public <T> void show() { }  //Compiler error
    }

    Como el método show() en clase no es el de reemplazar equivalente con el método de la interfaz, debido a un menor número de parámetros de tipo.

    Así, usted debe asegurarse de que la firma del método es exactamente el mismo, como se especifica en el que JLS sección (del Mismo nombre, el mismo número y tipo de parámetros (incluidos los parámetros de tipo), co-variante de un tipo de retorno).

    OriginalEl autor Rohit Jain

  2. 6

    Según java overridding

    El método de reemplazo tiene el mismo nombre, el número y tipo de parámetros y el tipo de retorno del método reemplaza. Un método de reemplazo también puede devolver un subtipo del tipo devuelto por el método. Esto se llama una covariante tipo de retorno.

    Aquí su método de tipo de retorno es diferente por lo que no es overridding.

    ok si puedo cambiar el método de retorno a T una vez que la T se extiende vo, y luego me puede devolver una aplicación de vo en ese caso DemonstrativoReceitaDespesasAnexo12vo?
    necesita cambiar el tipo de retorno de la super clase de método para DemonstrativoReceitaDespesasAnexo12Vo de void también.

    OriginalEl autor Prabhaker

  3. 1

    La lectura de los comentarios de arriba, entiendo que el enfoque no funciona, así que hacer algunos cambios en el código y el trabajo como un encanto, sigue el código:

    superclase:

    protected VO processarRelatorioComEstado(Date dataInicial, Date dataFinal, Enum<?> estado) throws RelatorioException {
    
        throw new UnsupportedOperationException("method not overridden");
    }

    y la subclase:

    public VO processarRelatorioComEstado(Date dataInicial, Date dataFinal, Enum<?> estado) throws RelatorioException {
    //do something
    return VOsubtype;
    
    }

    gracias chicos.

    OriginalEl autor danillosl

Dejar respuesta

Please enter your comment!
Please enter your name here