有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java集合获取包含项的类型

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

我想知道包含的元素的类是什么。。。我知道他们都是同一类型的

尝试:

Class c = set.getClass.getComponentClass();

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


共 (5) 个答案

  1. # 1 楼答案

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

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

  2. # 2 楼答案

    给定

    Set<T> s
    

    由于类型擦除,无法获取T。对于EnumSet这样的特定实现,您可能可以获得它,但一般来说是不可能的

    你甚至不能从内容中推断出来。空集合或只包含null的集合的类型是什么?即使你不必担心这种情况,你能做的最好的事情就是通过查看当前的内容来计算类型T2 extends T,这将是不明确的:可能有一个接口类型bottom和一个抽象基类——你应该使用它

    最好的解决方案是创建一个类型包装TypedSet<T> implements Set<T>,在创建时使用Class<T>

  3. # 3 楼答案

    没有API可以直接做到这一点。你真正想要的是“具体化的泛型”,这在Java中还不存在。Java在泛型上执行类型擦除,因此在运行时通常不知道类型参数

    可以遍历集合,对每个元素调用getClass(),这样就可以找到可以容纳每个元素的最窄的具体类型。但是,这似乎不是很有用,因为您可能很容易忽略以下事实:例如,许多最近的公共祖先是java.lang.Object的元素都实现了相同的接口

    也许这是一个"XY Problem".真的想要实现什么

  4. # 4 楼答案

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

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

  5. # 5 楼答案

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