【问题标题】:return type of a generic object creation method通用对象创建方法的返回类型
【发布时间】:2014-02-06 10:14:15
【问题描述】:

我想创建一个将类名作为参数并返回该类的对象的方法,我当前的实现返回Object 的类型,它在需要时转换为正确的类型。我的问题是,我可以用通用方法来实现吗?比如...给出类名并直接返回它的一个实例?

【问题讨论】:

  • 你能举个例子吗?
  • 如何从类的 name 派生正确的泛型类型,即将String 转换为泛型T?当然,您可以进行未经检查的演员表,但这并不能真正改善您当前的手动演员表。
  • @fadytaher 你所有可能的类都有一个 0-arg 构造函数吗?
  • @RohitJain 我想我能做到

标签: java class generics reflection


【解决方案1】:

如果您需要使用特定(非默认)构造函数创建实例,那么您可以这样做:

public <T> T createInstanceFrom(Class<T> clazz, Class<?> ... params) {
    Constructor<T> constructor = clazz.getConstructor(params);
    T result = constructor.newInstance();
    return result;
}

请注意,您必须在此处处理几个可能的异常。

但是,如果你只需要一个可以通过默认类构造函数获取的实例,那么你可以这样做:

return clazz.newInstance();

【讨论】:

  • 不需要这种类型转换。您的代码可以只替换为clazz.newInstance()
  • @kocko 嗯,请告诉我,假设我有一个名为 Part 的类,如何使用 createInstanceFrom();现在?
  • 只需使用提供的方法:Part intastance = createInstanceFrom(Part.class); 或 Part instance = Part.class.newInstance();
【解决方案2】:

使用反射:

<your instance> = (<your type>)Class.forName(<your class name>).getDeclaredConstructor(<your constructor parameters>).newInstance(<those constructor parameters>);

当然,您依赖于所有具有相同参数的构造函数。这可以通过适当的单元测试来强制执行。

【讨论】:

  • 好的,但是如果这个语句在函数中,函数的返回类型应该是什么?
  • @fadytaher:在这种情况下使用泛型:请参阅 kocko 的答案。
【解决方案3】:

你可以这样做:

public static <T> T cst(Class<? extends T> clazz)
{
    try 
    {
        return clazz.newInstance();
    }
    catch (InstantiationException | IllegalAccessException e) 
    {
        return null;
    }
}

【讨论】:

    【解决方案4】:
    public static <T>T  getInstance(Class<T> type)
                throws Exception {
            return type.newInstance();
    
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-10
      • 2012-05-04
      • 2017-01-21
      • 1970-01-01
      • 2023-03-07
      • 2015-11-25
      • 1970-01-01
      相关资源
      最近更新 更多