The idea with interfaces is that they specify a contract that a class can implement. This idea is largely covered in the other post that you read.
The reason that just implementing the methods from the interface directly isn't enough is that other methods can use the interface type to require that those methods are present.
Let's use AutoCloseable as an example. The only method is a close method, but it's much easier for a method to express the thought "I need a parameter that can be closed" using the type than listing out all of the methods:
public void passMeSomethingThatICanClose(AutoCloseable bar) {
//stuff goes here
bar.close(); //the compiler knows this call is possible
}
If we didn't have the concise type name, the method would have to list the requirements explicitly, which wouldn't be very easy, especially when the interface "contract" has many methods.
This works the other way as well. By having a specific keyword "implements AutoCloseable" to signify the intention, the compiler can tell you if you haven't implemented the contract correctly.
public class BrokenCloseable implements AutoCloseable {
public void colse() { //ERROR — see the typo?
//blah
}
}
This is an error, because the method has the wrong name. In Java, the compiler can (and will) tell you this. But if you were just responsible for implementing the methods yourself, you wouldn't get an error. Instead, your class would just silently "not be" autocloseable.
Some other languages (Python is a good example) don't do things this way — instead they do things the way you've suggested in the question. This is called "duck typing" (if it looks like a duck, and quacks like a duck, treat it like a duck), and it's also a viable way to do things, just different from Java.