Определить тип пустой коллекции подстановочных знаков (например, список <? Extends Number>) - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть Collection элементов.Когда Collection заполнен, легко получить первый элемент и выяснить, что это за тип.Но когда Collection пусто, я не могу понять, как это сделать.

Пример ниже:

public static void main(final String args[])
{
    typer(Collections.singletonList(Integer.valueOf(0)));
    typer(Collections.singletonList(Double.valueOf(0)));

    typer(Collections.<Integer> emptyList());
}

private static void typer(final List<? extends Number> list)
{
    if (list.isEmpty())
    {
        System.out.println(list.getClass());
    }
    else
    {
        System.out.println(list.get(0).getClass());
    }
}

Полученный результат:

class java.lang.Integer
class java.lang.Double
class java.util.Collections$EmptyList

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Я думаю, что полезно не думать о List<Integer> как о "списке из Integer s".

Вместо этого думайте об этом как о List;но вы также дали указание компилятору прекратить вводить что-либо, кроме Integer (или подкласса, или нуль), и запретить вынимать что-либо, кроме Integer (или ноль).

Если вы думаете об этом так, вы избавляетесь от мысли, что «вы можете определить тип List». Это просто List.Информация о Integer существует только во время компиляции.

Даже если список не пустой, вы не можете точно сказать, что такое «тип» списка: непустой List<Object>может содержать только экземпляры Integer.Таким образом, вы можете определить только нижнюю границу типа.

0 голосов
/ 19 ноября 2018

Вы не можете. Фактические параметры типа стираются во время выполнения. Пустой List<String> точно такой же, как List<Integer>.

...