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 MyServiceImpl
que se extiende la clase base GeneralServiceImpl
con método abstracto doB
.
Creé una interfaz GeneralService
para GeneralServiceImpl
y añadí también doB
mé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 GeneralServiceImpl
el 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
GeneralService
que pueda abrir la aplicación de sudoB()
métodoNota otra razón que necesito es también añadir un soporte de servicio a la primavera método existente
Por favor, vea que no es un error.
Vamos a entender (He hecho la representación pictórica de entender mejor):
Está claro que las GeneralServiceImpl
anulaciones de clase doB()
en función de la implementación de la interfaz GeneralService
, así como MyServiceImpl
los instrumentos doC()
en función de su interfaz de la aplicación MyService
.
Además, no hay relación entre la herencia MyServiceImpl
y GeneralServiceImpl
-> MyServiceImpl
se extiende GeneralServiceImpl
, por lo que MyServiceImpl
tiene 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 MyService
y GeneralServiceImpl
, por lo eclipse
que no es consciente de su runtime
puesta 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 runtime
la 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 Interface
implementación class
debe anular todas las funciones declaradas (menos abstract
). y como un IDE Eclipse
en la búsqueda de una implementación de una función a partir de Interface
entonces 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 MyServiceImpl
y GeneralServiceImpl
tenemos otra clase SubGeneralServiceImpl
que también overrides doB()
como
public class SubGeneralServiceImpl extends GeneralServiceImpl {
public void doB() {
//
}
}
y ahora MyServiceImpl
se extiende SubGeneralServiceImpl
y SubGeneralServiceImpl
se extiende además GeneralServiceImpl
.
Por lo tanto, incluso ahora MyServiceImpl
tiene DOB () , pero ahora el acceso a la aplicación 2 DOB () , que se puede ver:
Así, en vista estático (compilador) es absolutamente bien en cuanto a MyServiceImpl
las 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 MyService
interfaz.
Espero que esto ayude.