我有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
答案 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
的实例。因此,您只能确定类型的下限。