动态创建类的实例

时间:2013-11-18 18:10:08

标签: java

在下文中,我想要发生的是 w.someMethod()返回 SomeSubClass 的实例。不幸的是它不起作用。我相信代码会比我能更好地解释它。

public abstract class SomeSuperClass {
    public SomeSuperClass(int x) {
        // do nothing
    }
    public SomeSuperClass someMethod() {
        //this line
        return (new Class()).getDeclaredConstructor(getClass()).newInstance(1));
        //this line
    }
}

public class SomeSubClass extends SomeSuperCLass {
    public SomeSubClass(int x) {
        super(x);
    }
}

public static void main(String[] args) {
    SomeSubClass w = new SomeSubClass(3);
    SomeSubClass q = w.someMethod();
}

这是我的回复

SomeSuperClass.java:7: error: Class() has private access in Class
    return (new Class()).getDeclaredConstructor(getClass()).newInstance(1);
            ^
SomeSuperClass.java:7: error: incompatible types
    return (new Class()).getDeclaredConstructor(getClass()).newInstance(1);
                                                                       ^
required: SomeSuperClass
found:    Object
Main.java:4: error: incompatible types
    SomeSubClass q = w.someMethod();

为了进一步说明,以下代码可以满足我的需求:

public abstract class SomeSuperClass {
    public SomeSuperClass(int x) {
        // do nothing
    }
    public abstract SomeSuperClass someMethod();
}

public class SomeSubClass extends SomeSuperCLass {
    public SomeSubClass(int x) {
        super(x);
    }
    public SomeSuperClass someMethod() {
        return new SomeSubClass(1);
    }
}

public static void main(String[] args) {
    SomeSubClass w = new SomeSubClass(3);
    SomeSubClass q = w.someMethod();
}

但我希望 someMethod 在课程中 SomeSuperClass

3 个答案:

答案 0 :(得分:3)

new Class不是获取类对象的正确方法。相反,正确的方法是使用方法getClass()

return getClass().getDeclaredConstructor(int.class).newInstance(1);

但是你不需要使用反射来创建一个像你已经拥有的对象。相反,您可以像JoeC建议的那样覆盖方法someMethod

答案 1 :(得分:2)

覆盖子类中的someMEthod()?

public class SomeSubClass extends SomeSuperCLass {
    public SomeSubClass(int x) {
        super(x);
    }
    public SomeSuperClass someMethod(){
        return new SomeSubClass(1);
    }
}

答案 2 :(得分:2)

如果你想要的是这个方法返回一个调用它的类的新实例,使用一个带int的构造函数,那么你应该这样做:

return getClass().getDeclaredConstructor(int.class).newInstance(1);

但是不清楚为什么你不会像JoeC建议的那样只重写方法来显式实例化每个子类中的子类。