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


Es legal hacer esto en Java:

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

Cómo puedo hacer esto (sintaxis no 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 usar objetos que sean tanto Anexables como Cerrables, sin requerir un tipo específico. Hay varias clases estándar que hacen esto, por ejemplo, BufferedWriter, PrintStream, etc.

Si defino mi propia interfaz

 interface AppendableAndCloseable extends Appendable, Closeable {}

Eso no funcionará ya que las clases estándar que implementan Appable y Closeable no lo hacen implementar mi interfaz AppendableAndCloseable (a menos que no entienda Java tan bien como creo que lo hago... las interfaces vacías todavía añaden singularidad por encima y más allá de sus superinterfaces).

Lo más cercano que se me ocurre es hacer una de las siguientes cosas:

  1. Elija una interfaz (por ejemplo, Anexable), y use pruebas de tiempo de ejecución para asegurarse de que el argumento es un instanceof los otros. Inconveniente: el problema no se detecta en tiempo de compilación.

  2. Requieren múltiples argumentos (capturas compile-time correctness but looks dorky):

    void spew(Appendable xAppend, Closeable xClose)
    {
        xAppend.append("Bleah!\n");
        if (timeToClose())
            xClose.close();
    }
    
Author: Jason S, 2009-10-01

1 answers

Podrías hacerlo con genéricos:

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

Su sintaxis era casi correcta, en realidad.

 81
Author: Michael Myers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-30 22:00:34