微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

 // 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();

所以我的问题是:无论如何我可以在没有硬编码或强制转换的情况下为我的抽象类实例一个新的子类?诸如动​​态或反射之类的东西

解决方法

如果我理解正确,你可以通过反思来做到这一点。

假设您有 Param 类和 Expression 类:

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() {}
}

您需要一个方法来告诉您要创建哪个类,例如 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();

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。