【问题标题】:Determine type of empty wildcard collection (e.g. List<? extends Number>)确定空通配符集合的类型(例如 List<? extends Number>)
【发布时间】:2018-11-19 15:10:16
【问题描述】:

我有一个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

【问题讨论】:

  • “当集合被填充时,很容易得到第一个元素并计算出它是什么类型”不,不是。我可以创建class X extends Numberclass Y extends X 并将Y 的实例放入List&lt;X&gt;。通过查看第一个元素,您可以推断List 的类型为List&lt;Y&gt;,即使它不是。
  • 另外,你不能。如果您的设计依赖于您了解元素的类型,那么我会说 99% 确定您的设计是错误的。
  • @Michael 我很感激我不能确保它是唯一的 X,而不仅仅是扩展 X 的东西,但这种区别对我有用。

标签: java generics collections


【解决方案1】:

你不能。 Actual type parameters are erased during run time. 空的List&lt;String&gt;List&lt;Integer&gt; 完全相同。

【讨论】:

    【解决方案2】:

    我认为最好不要将List&lt;Integer&gt; 视为“Integers 的列表”。

    相反,将其视为简单的List;但是你也给了编译器一个提示,阻止你输入除Integer(或子类,或null)之外的任何东西,并阻止你取出除Integer(或null)之外的任何东西。

    如果你这样想,你就摆脱了“你可以确定List的类型”的想法。 这只是一个ListInteger 的东西只存在于编译时。

    即使列表是非空的,您也无法真正判断列表的“类型”是什么:非空的List&lt;Object&gt; 只能包含Integer 的实例。因此,您只能确定类型的下限。

    【讨论】:

      猜你喜欢
      • 2013-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多