在下文中,我想要发生的是 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
答案 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建议的那样只重写方法来显式实例化每个子类中的子类。