No se pudo implementación abierta para el método añadido a la interfaz de clase base en Eclipse

user7294900:

Estoy usando Eclipse neón.

Básicamente estoy creando una nueva interfaz y añadiendo a la misma un método existente que se encuentra en diferente clase base.

Tengo una clase MyServiceImplque se extiende la clase base GeneralServiceImplcon método abstracto doB.

Creé una interfaz GeneralServicepara GeneralServiceImply añadí también doBmétodo:

public interface GeneralService {    
    abstract void doB();
}

public class GeneralServiceImpl implements GeneralService {
   @Override
   public void doB() { }
   }
}
@Service
public class MyServiceImpl extends GeneralServiceImpl implements MyService {
     @Override
     public void doC() { }
}

Y mi nueva interfaz son esperando para usar GeneralServiceImplel métododoB()

public interface MyService {
    public void doC();
    public void doB();
}

Esto funciona, pero en Eclipse cuando hago clic en doB()el método ( doC()obras) en MyService abierto implementación ( Ctrlclick + botón izquierdo del ratón) no puedo encontrar ninguna aplicación disponible (ver más abajo)

Es Eclipse error? Se construye erróneamente mi entorno? es mi expectativa equivocada?

  • Nota de GeneralServiceque pueda abrir la aplicación de su doB()método

  • Nota otra razón que necesito es también añadir un soporte de servicio a la primavera método existente

Vivek:

Por favor, vea que no es un error.

Vamos a entender (He hecho la representación pictórica de entender mejor):

introducir descripción de la imagen aquí

Está claro que las GeneralServiceImplanulaciones de clase doB()en función de la implementación de la interfaz GeneralService, así como MyServiceImpllos instrumentos doC()en función de su interfaz de la aplicación MyService.

Además, no hay relación entre la herencia MyServiceImply GeneralServiceImpl-> MyServiceImplse extiende GeneralServiceImpl, por lo que MyServiceImpltiene doB(){}.

Ahora tenemos que entender aquí que los IDE, terminación y compilador utilizan la visión estática.

Si quieres saber carrera vista tiempo, entonces uno tiene que utilizar el modo de depuración.

Por lo tanto, si vemos la forma en que sus clases y la interfaz está diseñado no existe una relación directa entre MyServicey GeneralServiceImpl, por lo eclipseque no es consciente de su runtimepuesta en práctica y por lo tanto no pone de manifiesto la misma.

En lugar de que la línea de puntos en el diagrama representa runtimela relación y por lo tanto la aplicación de vacío doB();función.


La adición de más información sobre la base de @howlger comentario :

Para una Interfaceimplementación classdebe anular todas las funciones declaradas (menos abstract). y como un IDE Eclipseen la búsqueda de una implementación de una función a partir de Interfaceentonces se ve sólo para aplicación directa en la implementación de clases. (como por doC()funciona). [visión estática / compilador]

Ahora, imagine que entre MyServiceImply GeneralServiceImpltenemos otra clase SubGeneralServiceImplque también overrides doB()como

public class SubGeneralServiceImpl extends GeneralServiceImpl {
    public void doB() {
            //
        }
    }

y ahora MyServiceImplse extiende SubGeneralServiceImply SubGeneralServiceImplse extiende además GeneralServiceImpl.

Por lo tanto, incluso ahora MyServiceImpltiene DOB () , pero ahora el acceso a la aplicación 2 DOB () , que se puede ver:

introducir descripción de la imagen aquí

Así, en vista estático (compilador) es absolutamente bien en cuanto a MyServiceImpllas anulaciones doB()y doC()... Sin embargo Eclipse como un IDE no está seguro de lo que va a ser utilizado, que se produce en tiempo de ejecución, por lo tanto no es capaz de darle la implementación de la aplicación doB()cuando se intentó recibiendo de MyServiceinterfaz.

Espero que esto ayude.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=197565&siteId=1
Recomendado
Clasificación