我得到了一组没有指定类型的传递给我方法的元素。
我想知道所包含元素的类是什么......我知道它们都属于同一类型。
尝试:
Class c = set.getClass.getComponentClass();
但这可能不起作用,因为它仅适用于数组集合。
答案 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()
。
此修补程序仅适用于非空集合,并且当集合仅包含相同类型的元素时,将返回正确的结果。