Пояснение к этой алмазной записи?

Из официального руководства по Java JDK1.7 я получил эту цитату, но я не понимаю, как она работает. Кто-нибудь может объяснить? Другими словами, как ромб выводит тип Integer, когда ему передана пустая строка?

MyClass<Integer> myObject = new MyClass<>("");

В этом примере компилятор выводит тип Integer для параметра формального типа X универсального класса MyClass. Он выводит тип String для параметра формального типа T конструктора этого универсального класса.

2 ответа

Решение

Цитата указывает, что в вашем классе есть универсальный конструктор, который объявляет свой собственный параметр типа. Это похоже на то, как вы создаете универсальный метод. Параметр типа для конструктора выводится из аргумента, который вы передаете при создании экземпляра класса.

Вот простая версия класса, которая соответствует этому вызову:

 class MyClass<T> {
    <S> MyClass(S arg) {
        System.out.println(arg);
    }
 }

Теперь, когда вы создаете экземпляр своего класса, как в вашем коде, параметр типа T выводится как Integerи введите параметр S в конструкторе выводится как Stringиз аргумента вы передали.

Что касается оператора diamond, начиная с Java 7, вам не нужно указывать аргументы типа при создании экземпляра универсального класса, если вы уже присваиваете ссылку на ссылку. Аргумент типа будет выведен из того, который используется с ссылочным типом, здесь Integer,

Integer часть выводится из использования результата вызова конструктора - это присвоение переменной типа MyClass<Integer>, следовательно Integer часть выведена для алмаза. Аргумент конструктора не имеет к этому отношения (если только он не должен быть того же типа, в этом случае вы просто получите ошибку компиляции.)

По сути, если аргумент типа очищается из контекста, в котором используется выражение (где "очистить", конечно, означает "следовать точным правилам"), компилятор выведет его.

Другие вопросы по тегам