【问题标题】:Method in abstract class returning an instance of the class that implements it抽象类中的方法返回实现它的类的实例
【发布时间】:2014-02-05 21:15:20
【问题描述】:

在抽象类中是否有可能有一个“一般”返回扩展它的类的实例的方法?

【问题讨论】:

    标签: java generics inheritance abstract-class


    【解决方案1】:

    您可以通过以下方式实例化该类,但也许您应该告诉我们您想要实现的目标。另一种更简单的方法可能是实现Clonable

    public abstract class AbstractClass {
        public AbstractClass getInstance() {
            return getClass().newInstance();
        }
    }
    

    或者在构造函数接受参数的情况下:

    return getClass().getDeclaredConstructors(String.class, Integer.class).newInstance(someString someInteger);
    

    【讨论】:

    • 如果抽象类有一个带参数的构造函数怎么办。我可以用上面的方法传递它们吗,因为实现类肯定会做 super(arg1,arg2)
    【解决方案2】:

    这只是为了提供一些额外的信息,并在 cmets 中回答您的问题。鉴于您问题中的信息,Kayaman 的回答也正是我所建议的。

    但是,正如您在评论问题中所暗示的那样,此方法只会调用默认构造函数。为了调用参数化构造函数之一,您需要使用getDeclaredConstructor 方法通过其签名有效地“定位”它。

    像这样(借用 Kayaman 的回答):

    public abstract class AbstractClass {
        public AbstractClass getInstance(Object[] parameters, Class<?>...parameterTypes) {
            return getClass().getDeclaredConstructor(parameterTypes).newInstance(parameters);
        }
    }
    

    当然要确保parametersparameterTypes 中元素的顺序与构造函数的签名相对应。

    【讨论】:

      猜你喜欢
      • 2016-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-11
      • 2016-11-08
      • 1970-01-01
      • 1970-01-01
      • 2015-08-13
      相关资源
      最近更新 更多