Java集 - 获取包含项的类型

时间:2011-11-15 18:27:09

标签: java

我得到了一组没有指定类型的传递给我方法的元素。

我想知道所包含元素的类是什么......我知道它们都属于同一类型。

尝试:

Class c = set.getClass.getComponentClass();

但这可能不起作用,因为它仅适用于数组集合。

5 个答案:

答案 0 :(得分:1)

鉴于

Set<T> s

由于类型擦除,您无法获得T。您可能能够为EnumSet等特定实现获取它,但通常不可能。

你甚至无法从内容中推断它。空集的类型底部是什么,或者只包含null的集合是什么?即使您不必担心这种情况,您可以做的最好的方法是通过查看当前内容来计算类型T2 extends T,这将是不明确的:可能存在接口类型底部和抽象基类 - 你应该使用哪个。

最佳解决方案是创建一个类型包装器TypedSet<T> implements Set<T>,在创建时需要Class<T>

答案 1 :(得分:1)

没有API可以直接执行此操作。你真正想要的是“reified generics”,它在Java中尚不存在。 Java在泛型上执行类型擦除,因此通常在运行时不知道类型参数。

您可以迭代集合,并在每个元素上调用getClass(),这样,找到可以容纳每个元素的最窄的具体类型。但是,这似乎没有用,因为你可能很容易错过这样一个事实:例如,最近的共同祖先java.lang.Object的许多元素都实现了相同的接口。

也许这是"XY Problem".想要实现的

答案 2 :(得分:0)

获取其中一个对象并在其上调用getClass()。

答案 3 :(得分:0)

Set set = *method argument*;
Iterator iter = set.iterator();
while (iter.hasNext()) {
   Object object = iter.next();
   System.out.println(object.getClass());
}

如果必须,迭代集合中的元素并打印类类型。集合是元素的集合。

答案 4 :(得分:0)

泛型有其他名称“擦除”。第二个名称清楚地表明泛型只存在于源代码中,并由编译器删除。因此,任何集合(包括集合)的组件类的信息都只是由编译器删除,并且在字节代码中不可用。这就是为什么你不能通过检查集合本身来获得集合组件的类型。 你唯一能做的就是获得set的一个(第一个)元素并调用它getClass()

此修补程序仅适用于非空集合,并且当集合仅包含相同类型的元素时,将返回正确的结果。