代码之家  ›  专栏  ›  技术社区  ›  Idan K

实例化可分配给集合的类

  •  2
  • Idan K  · 技术社区  · 16 年前

    我尝试了以下方法:

    Class<?> clazz = ... // I got this from somewhere
    
    if (!clazz.isInterface() && java.util.Collection.class.isAssignableFrom(clazz)) {
        java.util.Collection<?> collection = clazz.newInstance();
    }
    

    可以预见,它无法工作,因为它无法将未知类型转换为java.util.Collection。

    我也想过这样做:

    Class<? extends java.util.Collection<?>> collectionClass = Class<? extends java.util.Collection<?>> clazz;
    java.util.Collection<?> collection = clazz.newInstance();
    

    正确的方法是什么?谢谢

    5 回复  |  直到 16 年前
        1
  •  3
  •   Adeel Ansari    16 年前

    由于您使用的通配符,强制转换是必须的。即 Class<?> clazz . 演员不是一个黑客,来吧。这里的罚款还算合理,因为它正在接受检查。

        2
  •  0
  •   Francis Upton IV    16 年前

    在使用newInstance()时,必须使用强制转换,这是无法避免的。你的第一个例子很好。

        3
  •  0
  •   Stephen C    16 年前

    这是一个有趣的问题。第二种形式避免了对调用结果进行显式类型转换 clazz.newInstance() . 实际上,发出的代码将包含隐式类型转换,因为编译器不知道 newInstance() 方法欺骗(执行“不安全的转换”)并返回错误类型的内容。

        4
  •  0
  •   whiskeysierra    16 年前

    尝试 clazz.asSubClass(Collection.class).newInstance() Collection<?>

        5
  •  0
  •   PaulMurrayCbr    16 年前

    在if语句之后,您知道clazz是collection的一个子类(即使编译器不知道这一点)。所以你可以投下它:

    Class<?> clazz = ... // I got this from somewhere
    
    if (!clazz.isInterface() && java.util.Collection.class.isAssignableFrom(clazz)) {
        Class<Collection<?>> collectionClazz = (Class<Collection<?>>)  clazz;
        java.util.Collection<?> collection = collectionClazz.newInstance();
    }
    

    编译器会抱怨没有在运行时检查强制转换(因为在运行时通用参数丢失),但这没关系。

    ... 刚才看到了“asSubclass”方法。执行相同的任务,但会在运行时进行检查-它会像if()那样重新执行测试。

    话虽如此,现在每当我看到instanceof关键字时,我立刻怀疑应该使用泛型类型。也就是说,包含上述代码的类或方法应该可以访问参数化的类T并使用类。