2009-09-30 14 views
46

Es legal hacer esto en Java:¿Cómo puedo requerir un argumento de método en Java para implementar múltiples interfaces?

void spew(Appendable x) 
{ 
    x.append("Bleah!\n"); 
} 

¿Cómo puedo hacer esto (la sintaxis no es legal):

void spew(Appendable & Closeable x) 
{ 
    x.append("Bleah!\n"); 
    if (timeToClose()) 
     x.close(); 
} 

me gustaría si es posible forzar a las personas que llaman a utilizar objetos que son a la vez Accesible y cerrable, sin requerir un tipo específico. Hay varias clases estándar que hacen esto, p. BufferedWriter, PrintStream, etc.

Si defino mi propia interfaz

interface AppendableAndCloseable extends Appendable, Closeable {} 

que no funciona ya que las clases estándar que implementan Anexables y cerrarse no implementan la interfaz de mi AppendableAndCloseable (a menos que no entiendo Tanto Java como creo que ... las interfaces vacías aún agregan singularidad más allá de sus superinterfaces).

Lo más cerca que puedo pensar es hacer uno de los siguientes:

  1. recoger una interfaz (por ejemplo, Anexables), y utilizar las pruebas de tiempo de ejecución para asegurar el argumento es un instanceof los otros. Desventaja: problema no detectado en el momento de la compilación.

  2. requieren múltiples argumentos (capturas en tiempo de compilación corrección, pero se ve dorky):

    void spew(Appendable xAppend, Closeable xClose) 
    { 
        xAppend.append("Bleah!\n"); 
        if (timeToClose()) 
         xClose.close(); 
    } 
    
+1

Eso es seguro que falta. ¿Pero cuál es tu pregunta exactamente? – NawaMan

Respuesta

78

que podría hacerlo con los genéricos:

public <T extends Appendable & Closeable> void spew(T t){ 
    t.append("Bleah!\n"); 
    if (timeToClose()) 
     t.close(); 
} 

Su sintaxis era casi derecha , actualmente.

+0

aha! ¡Viva! :-) –

+0

¿Funciona esto también para los implementos? Estoy tratando de hacer que un objeto parámetro tenga que ser serialzable? – Zapnologica

+1

@Zapnologica: ¿para implementar una interfaz? No, no puede poner restricciones de tipo adicionales en un parámetro genérico que se declaró en la interfaz. –

Cuestiones relacionadas