代码之家  ›  专栏  ›  技术社区  ›  dstackflow

java从arraylist的方法参数获取arraylist组件类型[重复]

  •  0
  • dstackflow  · 技术社区  · 6 年前

    我一直在试图找到一种方法,当作为参数传递给静态方法时,确定ArrayList的组件类型。我当前的尝试导致:

    public static <T> Class getArrayListClass(ArrayList<T> al) {
        Class clazz = null;
        for(T t: al) {
            if(t != null) {
                clazz = t.getClass();//Get first type found.
            }
        }
        return clazz;
    }
    

    是否有其他方法可以确定ArrayList的类型?更好的是,如何找到大小为0的ArrayList的组件类型?静态方法不知道ArrayList对象的“谁拥有所有权”,因此很难使用字段进行反射,因为(根据我所阅读的内容)您需要知道容器来自何处(当然原始来源会知道它的类型),或者有人引用了已知类型(非类型T)的类似容器,或者只知道它的类型。。。 有一篇关于类似内容的帖子,使用列表: Get generic type of java.util.List 在这些解决方案中,他们使用反射,并表示也可以对参数和返回类型进行反射,但没有T型参数的示例。。。该链接上的第二个最佳答案显示了一个从方法参数获取类型的示例,但不是类型T,在我的示例中,我将ArrayList作为类型T参数获取。有什么好的解决方案吗?我当前的方法只能应用于大小为>的ArrayList;0。我以前从基元数组中获取过类型(幸运的是): someArray.getClass().getComponentType()//T[] 虽然它们有很大的不同,但这打开了我最后两个选择中的一个,我已经看到并且宁愿避免:A)将ArrayList转换为已知类型的数组(不是对象),然后当其他方法/对象需要知道类型时,它们可以使用getComponentType方法将其展开,或者B)始终将类型作为额外参数发送。。。不知道这是不是复制品,但我看了一下;如果是的话,请把我送到正确的方向。谢谢

    1 回复  |  直到 6 年前
        1
  •  1
  •   sprinter    6 年前

    我怀疑您误解了Java泛型的工作方式。泛型的设计目标是不存在实例化多个类型的泛型类的运行时开销。换句话说,它实际上只是一个隐藏的类,参数化类型仅在编译阶段可用:在运行时,参数化类型消失。这就是所谓的擦除。看见 here 有关其工作原理的教程。

    在您的情况下,这意味着在运行时(即反射正在运行时)根本不可能找到T的真实类型,因为运行时没有真实类型。它已被擦除。

    在代码中,您将对象传递给具有实类型的方法,您可以使用反射来查找其类型。

    请记住,使用反射几乎总是一种糟糕设计的迹象。有少数情况下是必要的(例如,对象序列化),但在绝大多数情况下,有更好的方法来实现结果。