How can I require a method argument in Java to implement multiple interfaces?
It's legal to do this in Java:
void spew(Appendable x)
{
x.append("Bleah!\n");
}
How can I do this (syntax not legal):
void spew(Appendable & Closeable x)
{
x.append("Bleah!\n");
if (timeToClose())
x.close();
}
I would like if possible to force callers to use objects that are both Appendable and Closeable, without requiring a specific type. There are multiple standard classes that do this, e.g. BufferedWriter, PrintStream, etc.
If I define my own interface
interface AppendableAndCloseable extends Appendable, Closeable {}
that won't work since the standard classes that implement Appendable and Closeable do not implement my interface AppendableAndCloseable (unless I don't understand Java as well as I think I do... empty interfaces still add uniqueness above and beyond their superinterfaces).
The closest I can think of is to do one of the following:
pick one interface (e.g. Appendable), and use runtime tests to ensure the argument is an
instanceof
the others. Downside: problem not caught at compile time.-
require multiple arguments (catches compile-time correctness but looks dorky):
void spew(Appendable xAppend, Closeable xClose) { xAppend.append("Bleah!\n"); if (timeToClose()) xClose.close(); }
Solution 1:
You could do it with generics:
public <T extends Appendable & Closeable> void spew(T t){
t.append("Bleah!\n");
if (timeToClose())
t.close();
}
Your syntax was almost right, actually.