Какова цель позади подстановочных знаков и как они отличаются от дженериков?

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

Чтобы установить размер шрифта для этого определенного класса размера, сначала выберите UILabel. Под инспектором атрибутов вы должны увидеть кнопку плюс (+) рядом с полем шрифта. Нажмите кнопку + и выберите «Компактная ширина»> «Обычная высота» (или согласно вашему требованию выберите ширину и высоту). Затем вы увидите новую запись для опции «Шрифт», которая посвящена этому классу определенного размера. Сохраните размер неповрежденным для исходного параметра Font, но измените размер поля шрифта wC hR (OR в соответствии с вашим выбором) на нужные точки (например, 14).

27
задан Bill the Lizard 27 May 2010 в 16:24
поделиться

4 ответа

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

Представьте, что у вас есть метод:

int countLegs ( List< ? extends Animal > animals )
{
   int retVal = 0;
   for ( Animal cur : animals )
   {
      retVal += cur.countLegs( );
   }

   return retVal;
}

С помощью этой подписи вы можете сделать это:

List<Dog> dogs = ...;
countLegs( dogs );

List<Cat> cats = ...;
countLegs( cats );

List<Animal> zoo = ...;
countLegs( zoo );

Если, однако, вы объявите countLegs следующим образом:

int countLegs ( List< Animal > animals )

Тогда в предыдущем примере скомпилировалось бы только countLegs( zoo ), потому что только этот вызов имеет правильный тип.

24
ответ дан Alexander Pogrebnyak 28 November 2019 в 04:54
поделиться

Дженерики Java инвариантны.

Предположим, у нас есть B расширяет A :

  • B является подтипом A
  • экземпляр B также является экземпляром A

Поскольку массивы Java ковариантны:

  • B [] является подтипом A []
  • instanceof B [] также является экземпляром A []

Однако универсальные шаблоны Java инвариантны:

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

  • a Список - это Список

Ссылки

Связанные вопросы

22
ответ дан 28 November 2019 в 04:54
поделиться

Вы можете хранить собак и кошек в List. В этом случае подстановочные знаки не нужны.

Допустим, у вас есть метод, который принимает список животных:

void foo(List<Animal> animals) {
    ...
}

Теперь вы не можете передать методу список собак - он принимает аргумент только типа List. Чтобы метод принимал все виды списков животных, нужен подстановочный знак: List, List, List, ...

void foo(List<? extends Animal> animals) {
    ...
}

Смотрите

http://java.sun.com/docs/books/tutorial/extra/generics/wildcards.html

2
ответ дан 28 November 2019 в 04:54
поделиться

Разница между вашими двумя примерами заключается просто в том, что первый представляет собой список общих / общих животных - поэтому вы можете добавить к нему любой тип животных и любой экземпляр подкласса типа Животное. (например, он может содержать несколько собак, несколько кошек, несколько дикобразов ...) Тогда как второй - List - будет списком одного конкретного подтипа класса animal. Это может быть любой, который вы выберете (он устанавливается каждый раз во время выполнения), но только один. Это будет либо список собак, или список кошек, или список черепах ... и т. Д.

9
ответ дан 28 November 2019 в 04:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: