Java集合获取包含项的类型
我得到一组传递给我的方法的元素,没有指定类型
我想知道包含的元素的类是什么。。。我知道他们都是同一类型的
尝试:
Class c = set.getClass.getComponentClass();
但这可能不起作用,因为它只适用于数组集合
你可以在下面搜索框中键入要查询的问题!
我得到一组传递给我的方法的元素,没有指定类型
我想知道包含的元素的类是什么。。。我知道他们都是同一类型的
尝试:
Class c = set.getClass.getComponentClass();
但这可能不起作用,因为它只适用于数组集合
# 1 楼答案
迭代集合中的元素并打印类类型(如果必须)。集合是元素的集合
# 2 楼答案
给定
由于类型擦除,无法获取
T
。对于EnumSet
这样的特定实现,您可能可以获得它,但一般来说是不可能的你甚至不能从内容中推断出来。空集合或只包含null的集合的类型是什么?即使你不必担心这种情况,你能做的最好的事情就是通过查看当前的内容来计算类型
T2 extends T
,这将是不明确的:可能有一个接口类型bottom和一个抽象基类——你应该使用它最好的解决方案是创建一个类型包装
TypedSet<T> implements Set<T>
,在创建时使用Class<T>
# 3 楼答案
没有API可以直接做到这一点。你真正想要的是“具体化的泛型”,这在Java中还不存在。Java在泛型上执行类型擦除,因此在运行时通常不知道类型参数
可以遍历集合,对每个元素调用
getClass()
,这样就可以找到可以容纳每个元素的最窄的具体类型。但是,这似乎不是很有用,因为您可能很容易忽略以下事实:例如,许多最近的公共祖先是java.lang.Object
的元素都实现了相同的接口也许这是一个"XY Problem".你真的想要实现什么
# 4 楼答案
仿制药还有另一个名字“擦除”。第二个名称清楚地表明泛型只存在于源代码中,并且被编译器删除。因此,任何集合(包括集合)的组件类的信息都会被编译器简单地删除,并且在字节码中不可用。这就是为什么不能通过检查集合本身来获取集合组件的类型。 你唯一能做的就是得到集合的一个(第一个)元素,并调用它的
getClass()
此修补程序仅适用于非空集合,当集合仅包含相同类型的元素时,将返回正确的结果
# 5 楼答案
获取其中一个对象并对其调用getClass()