确定空通配符集合的类型(例如List <!-?扩展Number->)

时间:2018-11-19 15:10:16

标签: java generics collections

我有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 :(得分:3)

不能。 Actual type parameters are erased during run time.空的List<String>List<Integer>完全相同。

答案 1 :(得分:0)

我认为不要将List<Integer>视为“ Integer的列表”很有帮助。

相反,您可以将其简单地视为List;但是您还提示编译器停止输入Integer(或子类或null)以外的任何东西,并停止除Integer(或空)。

如果您是这样想的,那么您就会摆脱“您可以确定List的类型”的想法。 这只是一个List 。关于Integer的内容仅在编译时存在。

即使列表是非空的,您也无法真正知道列表的“类型”是什么:非空的List<Object>只能包含Integer的实例。因此,您只能确定类型的下限。