Abstraction Barrier
It is not unusual for programmers to use an abstract data type they themselves have helped to implement. When they were implementing that data type, it was (for them at that time) a concrete data type.
When those same programmers use that abstract data type in the way it was intended to be used by others, it is an abstract data type.
This often causes confusion among inexperienced programmers, and sometime even among experienced programmers. To reduce that confusion, and to reduce errors caused by that confusion, modern programming languages make it possible to hide the representation of an abstract data type from programmers who should not be relying upon that representation.
When the data type is defined by a Java interface, the Java compiler prevents you from relying upon the representation of its values.