【问题标题】:Is it possible to instantiate a generic class by casting a "new Object()" as the generic class?是否可以通过将“new Object()”转换为泛型类来实例化泛型类?
【发布时间】:2012-06-04 23:07:09
【问题描述】:

所以我试图创建一个使用泛型扩展抽象类的类。 例如。

public abstract class Template<C extends Abstract>

但是,我需要在我的班级中实例化这个“C”。我想我也许可以这样做:

C s = (C) ((C)new Object()).getClass().getConstructor(Known.class,AnotherKnown.class).newInstance(objectOfKnownType,objectOfAnotherKnownType);

所以我的问题基本上是这是否可能。我感觉像

((C) new Object()).getClass()

可能会给我一些问题。

如果我把它改成:

C a;
C s = (C) (a.getClass().getConstructor( ... ).newInstance( ... ));

【问题讨论】:

  • 是的,它“可能”会给您带来一些问题。

标签: java generics object casting instantiation


【解决方案1】:
(C) new Object()

无效,可能会在稍后给您ClassCastException,因为Object 不是C

The way generics are implemented 表示Template 将不知道实例化它所使用的C,您必须创建一个采用Class 对象的方法或构造函数。

public abstract class Template<C extends Abstract>
{
    private Class<C> classOfC;

    public Template( Class<C> clazz ) {
        classOfC = clazz;
    }
}

【讨论】:

  • 请注意,这是由于 Java 字节码中泛型的性质造成的。在 .NET 中,您可以使用反射访问此信息。
  • 不应该是Class&lt;C&gt;吗?
  • @Jeffrey:可能是这样,但泛型也不知道它们被实例化的参数......
  • 也就是说,建议使用工厂对象,因为反射非常脆弱。 (许多对象故意不暴露构造函数...)
  • @K-ballo 好吧,如果不是Class&lt;C&gt;,您的解决方案将不再是类型安全的。您可以将Object.class 传递给该构造函数,编译器不会更聪明。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-03
  • 2011-04-02
  • 2011-10-11
相关资源
最近更新 更多