2013-10-11 6 views
4

В this topic я столкнулся с типами импликации.неявный тип и подстановочный знак

Вопрос 1. Что сильный Defenition неявного типа в Java или это неформальное понятие? Могу ли я определить неявный тип вручную? Верно ли, что все неявные типы одинаковы? Что такое неявный тип для компилятора?

Следующий пример кода:

List<? extends Number> nums= new ArrayList<Integer>(); 
nums.add(3);//error 

Я знаю, что мы можем назначить nums ссылкой на ArrayList<Double>.

Вопрос 2. В этом контексте ? extends Number является неявным типом, определяемым CAP#1. Верно ли, что компилятор знает, что только null является экземпляром этого неявного типа?

ответ

2

Правильный термин захват шаблона. Компилятор внутренне преобразует копию шаблона общего типа в захват подстановочного знака. Захват представляет собой конкретный неизвестный тип аргумента типа. Этот конкретный неизвестный тип, конечно, является членом семейства типов, обозначаемым подстановочным знаком.

Обратите внимание, что, поскольку может быть много разных типов, которые могут быть представлены с помощью подстановочных символов, мы говорим, что подстановочные знаки представляют собой семейство различных экземпляров параметризованных типов.

Могу ли я определить неявный тип вручную?

Анонимный тип переменной? Нет. Это создается компилятором внутри. Вы можете сказать, что вы поручаете компилятору создать анонимный аргумент типа, который заменит используемые подстановочные знаки.

Верно ли, что все неявные типы одинаковы?

No.Если вы используете, скажем, List<? extends Number> дважды в разных типах, они оба будут генерировать разные анонимные типы, а именно: CAP#1 extends Number и CAP#2 extends Number.

Что такое неявный тип для компилятора?

Я не понимаю этих вопросов.

Верно ли, что компилятор знает, что только null является экземпляром этого неявного типа?

Причина добавления null работы обусловлена ​​тем, что, null является допустимым значением для любого вида ссылки. Итак, каков бы ни был фактический аргумент типа, представленный подстановочным знаком, с радостью примет значение null.

+0

_I не понимаю эти вопросы. Я думал, что мы можем определить неявный тип в коде. Вы сказали, что неявный тип создается компилятором внутри себя. Следовательно, эти вопросы - это бессмысленность. –

+0

_ Аргумент анонимного типа? _ Можете ли вы опубликовать ссылку на официальные документы об анонимном аргументе? –

+0

@ St.Antario Это не в официальном документе. Этот термин используется для захвата подстановочных знаков в этом учебном пособии - http://www.angelikalanger.com/GenericsFAQ/FAQSections/TechnicalDetails.html#FAQ501 –

0

Вы не можете поместить что-либо в тип, объявленный с расширяет подстановочные за исключением для значения null, , которая принадлежит каждому ссылочного типа

List<Integer> ints = Arrays.asList(1,2,3); 
List<? extends Number> nums = ints; 
nums.add(null); // ok 
assert nums.toString().equals("[1,2,3,null]"); 

В общем случае, если структура содержит элементы с типом формы ? extends E, мы может получить Элементы из строя, но мы не можем положить элементы в конструкцию (кроме null). Для того, чтобы поместить элементы в структуру мы должны super подстановочные:

List<Number> nums = new ArrayList<Number>(); 
    nums.add(2); 
    nums.add(3.14); 

    List<? super Integer> ints = nums; 

    ints.add(3); 
    ints.add(null); 

Результат: [2, 3.14, null]

Смежные вопросы