Java's interfaces have some limitations, including:
- No code re-use.
- No run-time decoration or class annotation (to my knowledge) that allows you to say that a specific class implements an interface.
- No shared namespace between class names and interface names, so if you want to substitute a class of a different name where library code does not use an interface, you cannot.
The first is the most annoying, though if you're using Java without a code generator, you've asked for it. The third is the most serious.