In Java, it’s normal and normal that you can make your classes less restrictive when implementing or extending, which is the design decision of the Java developer. I can’t say why Sun solved it this way, and of course I can understand your problem with this, but the current method also has some advantages.
I see the interface as an opportunity to have several implementations for one job. For example, List classes that have different implementations for different needs. But all of them can be used through the List interface. Assume that the remove method throws a CheckedException if the item is not part of the list. Now, if I cannot be less restrictive in my implementations, all List classes should throw this CheckedException, even they are not needed or do not use it.
So, if I use the remove method inside my class, I am forced to handle a CheckedException. If I use my List class directly without an interface, I have to catch an exception. But for both cases, I am sure that I do not need this, and this will never happen. Thus, with the current approach, I can save a lot of "try catch ignore" blocks.
Another advantage of the current solution is that the class can easily match similar interfaces.
So, for example, in one lib, someone added a:
public interface Generator { String generate() throws IOException; }
And in another lib:
public interface GeneratorInterface { String generate(); }
If I write a class with the generate method without any CheckedException, I can easily use it to satisfy both interfaces and possibly work with both libs:
public class EmptyStringGenerator implements Generator,GeneratorInterface { @Override public String generate() { return ""; } }
Also, as far as I know, Java is the only language with such Checked and Unchecked exception handling, and therefore the design decisions that pull Java are weird compared to other languages that don't have checked exceptions.