Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:返回一个对象,该对象扩展了一个接受参数的抽象类_Java_Inheritance_Abstract Class - Fatal编程技术网

Java:返回一个对象,该对象扩展了一个接受参数的抽象类

Java:返回一个对象,该对象扩展了一个接受参数的抽象类,java,inheritance,abstract-class,Java,Inheritance,Abstract Class,我有一个接口 public interface I { public AnAbstractClass k(); //Abstract Class constructor takes two arguments } 对于这个接口方法的实现,我想返回一个泛型对象,它扩展了这个抽象类,并为它提供了两个参数的构造函数 澄清我想要实现的目标。在实现I的类中: public AnAbstractClass k() { //return a new implementing AbstractClas

我有一个接口

public interface I
{
public AnAbstractClass k();  //Abstract Class constructor takes two arguments
}
对于这个接口方法的实现,我想返回一个泛型对象,它扩展了这个抽象类,并为它提供了两个参数的构造函数

澄清我想要实现的目标。在实现I的类中:

public AnAbstractClass k()
{
   //return a new implementing AbstractClass object AbstractClassObject(arg1,arg2)
}

构造函数不是继承的,因此
AnAbstractClass
的子类不一定有两个参数的构造函数。如果一个子类确实有一个双参数构造函数,那么没有什么可以阻止您使用双参数构造函数创建该子类的实例并返回它:

public abstract class AnAbstractClass
{
    public AnAbstractClass(String foo, String bar) {
        System.out.format("created with (%s, %s)\n", foo, bar);
    }
}

public class BaseClass extends AnAbstractClass
{
    public BaseClass(String foo, String bar) {
        super(foo, bar);
    }
}

public interface I
{
    public AnAbstractClass k();
}

public class Implementation implements I
{
    @Override public AnAbstractClass k() {
        return new BaseClass("hello", "world");
    }
}

public class Demo
{
    public static void main(String[] args) {
        I i = new Implementation();
        AnAbstractClass a = i.k();
    }
}

这个问题有复杂的解决方案(大致上是:所有与依赖注入相关的东西)。但是,在这种情况下,没有太多的选项:必须有人提供这些参数,而且它们显然不能传递给接口方法。所以你可能需要像这样的东西

class Creator implements I
{
    private Object arg0;
    private Object arg1;
    void setArgs(Object arg0, Object arg1)
    {
        this.arg0 = arg0;
        this.arg1 = arg1;
    }

    @Override
    public AnAbstractClass k()
    {
        return new ConcreteClassExtendingAnAbstractClass(arg0, arg1);
    }

}
缺点是这个接口可能或多或少变得无用:如果它被设计成一个工厂,你就不能再以抽象的形式使用它了

I i = obtainFromSomewhere();
AnAbstractClass a = i.k();
但你必须知道具体的类型

Creator i = obtainFromSomewhere();
i.setArgs(..., ...);
AnAbstractClass a = i.k();

“给出它的两个参数构造函数”是什么意思?你的问题很不清楚。你是在问如何调用构造函数吗?很抱歉。我的意思是,重写接口方法的方法将为返回的AnAbstractClass对象提供其构造函数所需的参数。(根据定义,AbstractClass有一个带两个参数的构造函数)