如何在不强制转换的情况下为抽象 class 动态创建对象?

How to dynamically create an object for an abstract class without casting?

我在 JAVA 中有一个摘要 class 和几个子class。我有一个函数 return 是这些子 class 之一的实例。我不想检查几个 if...else 来创建基于 return 类型的对象。需要在 运行 时间动态地进行。这个 对我没有帮助
ReplaceExpression 是一个重载函数,return 个不同的子classes.

 // Expression is abstract class, A and B is subclass\
 // this return me null because i did not make a new object for e1, I know a subclass of Expression
       
   

Expression e1 = ReplaceExpression(1);
Expression e2 = ReplaceExpression("a");

    
    public Expression ReplaceExpression(int i)
    {
    Return new A();
    }
    
    public Expression ReplaceExpression(String s)
    {
    Return new B();
    }

我可以这样做,但我需要更清洁的解决方案:

if (ReplaceExpression(x).getClass().getSimpleName() == "A")
Expression e1 = new A();

所以我的问题是:无论如何我都可以为我的摘要 class 实例化一个新的 subclass 而无需硬编码或强制转换?动态或反射之类的东西

如果我理解正确的话,你可以反思一下。

假设您有 Param class 和 Expression class:

abstract class Param {
    public abstract Class<? extends Expression> getTargetClass();
}

class Sub1 extends Param {
    @Override
    public Class<? extends Expression> getTargetClass() {
        return A.class;
    }
}

class Sub2 extends Param {
    @Override
    public Class<? extends Expression> getTargetClass() {
        return B.class;
    }
}

class A extends Expression {
    public A() {}
}

class B extends Expression {
    public B() {}
}

你需要一个方法来告诉你要创建哪个class,比如getTargetClass.

然后在您的 ReplaceExpression 方法中:

public Expression ReplaceExpression(Param x) throws Exception {        
    Class<? extends Expression> cls = x.getTargetClass();
    Constructor<? extends Expression> con = cls.getConstructor();
    return con.newInstance();
}

虽然你可以这样做,但这不是一个好的解决方案,只需使用 if 语句:

public Expression ReplaceExpression(Param x) {
    if (x instanceof Sub1)
        return new A();
    if (x instanceof Sub2)
        return new B();
    return null;
}

更新

看起来你想根据返回的 Expression 创建一个新的 Expression。您可以使用反射:(仍然不推荐)

Class<? extends Expression> cls = ReplaceExpression(x).getClass();
Constructor<? extends Expression> con = cls.getConstructor();
Expression e1 = con.newInstance();