resueltos polimorfismo interfaz interfaces implementacion ejercicios ejemplos ejemplo clases clase abstractas abstracta java oop multiple-inheritance

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



polimorfismo java (1)

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, de ser posible, forzar a las personas que llaman a utilizar objetos que sean Appendable y Closeable, 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 Appendable y Closeable no implementan mi interfaz AppendableAndCloseable (a menos que no entienda Java tan bien como creo que lo hago ... las interfaces vacías aún agregan unicidad más allá de sus superinterfaces).

Lo más cerca que puedo pensar es hacer una de las siguientes cosas:

  1. elija una interfaz (p. ej. Appendable) y use pruebas de tiempo de ejecución para asegurarse de que el argumento sea una instanceof las demás. Desventaja: problema no detectado en el momento de la compilación.

  2. requiere múltiples argumentos (atrapa la corrección en tiempo de compilación pero se ve dorky):

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


Podrías hacerlo con genéricos:

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

Tu sintaxis era casi correcta, en realidad.