salida - Pasar clase de interfaz como parámetro en Java
paso de parametros en java ejemplo (7)
La idea detrás de las interfaces es que no necesita saber cuál es. Simplemente debería poder pasar un mensaje IMech y llamar a su funcionalidad independientemente de la implementación. Considera lo siguiente:
public interface IMech {
void sendMessage();
}
public class Email implements IMech {
@Override
void sendMessage() { /* stuff here to send email */ }
}
Ese es el patrón de uso típico para una interfaz. Si solo lo está utilizando para una opción, quizás deba considerar el uso de una enumeración.
enum IMech { EMAIL, INSTANT_MESSAGE, SNAIL_MAIL, YELL_OVER_CUBICLE }
public void sendNotification( IMech mechanism ){
switch(mechanism) {
case IMech.EMAIL: // do email .. etc
}
}
foo.sendNotification(IMech.EMAIL);
Ahora sé que estos no responden directamente a sus preguntas, pero estas son las formas típicas de uso, y generalmente son indicativas de patrones de diseño más adaptables. Después de todo, ¿realmente necesitas enviar un objeto de clase? Una enumeración parece más apropiada si simplemente estás determinando qué mecanismo usar.
Tengo una interfaz:
public interface IMech {
}
y una clase que lo implementa
public class Email implements IMech {
}
y una tercera clase que tiene implementado este método:
public void sendNotification( Class< IMech > mechanism ){
}
ahora estoy tratando de llamar a ese método como tal
foo.sendNotification(Email.class);
pero sigo recibiendo una excepción que dice:
The method sendNotification(Class<IMech>) in the type RemediationOperator is not applicable for the arguments (Class<Email>)
¿No debería funcionar esto si interconecta esa clase?
Los genéricos no funcionan de esa manera en Java. Lo que realmente necesita hacer es cambiar la firma del método a
public void sendNotification( Class< ? extends IMech > mechanism ){
}
¿O es eso super
vez de extends
? Permítanme consultar el capítulo Genéricos efectivos de Java ...
Editar: Effective Java dice:
Aquí hay un recordatorio para ayudarlo a recordar qué tipo de comodín usar: PECS significa producer-extends, consumer-super.
Supongo que esto producirá instancias de IMech, y que se extends
es correcto.
OMI sería más limpio si haces esto:
public void sendNotification( IMech mechanism ){
}
Siempre puedes obtener la clase dentro del método.
Porque las dos clases Class<IMechanism>
y Class<EmailNotification>
no están relacionadas por herencia, aunque lo son IMechanism
y EmailNotification
.
Debes hacer que tu método acepte una Class<? extends IMechanism>
Class<? extends IMechanism>
.
Quizás necesites
public void sendNotification( Class<? extends IMech> mechanism ) {
Su mecanismo de parámetro necesita usar un comodín delimitado, como ese:
public void sendNotification (clase <? extends IMech> mecanismo) {}
Citando el texto del enlace del tutorial de genéricos
En general, si Foo es un subtipo (subclase o subinterfaz) de Bar, y G es alguna declaración de tipo genérico, no es el caso de que G sea un subtipo de G.
la forma correcta es:
public void sendNotification(IMech mechanism) {
}
así que por favor, lea algunos tutoriales de Java sobre las interfaces de todos!