Подскажите причину, почему так происходит (вопрос внизу). Не буду добавлять код решения задачи, напишу только то, что относится к делу:
public class Solution {
    public static void main(String[] args) throws Exception {
        System.out.println(Matrix.NEO);
        System.out.println(Matrix.TRINITY);
    }

    static class Matrix {
        public static DBObject NEO = new User().initializeIdAndName(1, "Neo");
        public static DBObject TRINITY = new User().initializeIdAndName(2, "Trinity");
    }

    interface DBObject {
        DBObject initializeIdAndName(long id, String name);
    }

    static class User implements DBObject {
        //Пропущено

        @Override
        public String toString() {
            return String.format("The user's name is %s, id = %d", name, id);
        }
    }

}
Не понимаю, как мы можем получать вывод в консоль с переопределенного метода toString (The user's name is .. ), если он относится к классу User, а мы получаем объекта типа DBObject, в распоряжении которого есть только метод initializeIdAndName. Да, сам объект при создании имеет тип User, но ведь тут происходит расширение типа, которое, как мне казалось, должно было усечь доступные методы