我想在使用this.getClass()
调用构造函数之前调用super(...)
。
abstract class A extends SuperClass {
public A() {
super(Manager.someOtherMethod(this.getClass()))
// Does not work: "Cannot reference 'Object.getClass()' before
// supertype constructor has been called".
}
}
我读到了使用静态方法的解决方法,但无法从静态上下文调用this.getClass()
。
此问题取决于my previous question。
提前感谢您的答案:)
答案 0 :(得分:2)
虽然我对此需求持怀疑态度,但您可以通过将对Manager.someOtherMethod
的调用插入到超类的构造函数中来实现:
class SuperClass {
SuperClass() {
Object result = Manager.someOtherMethod(this.getClass());
}
}
class A extends SuperClass {}
class Manager {
static Object someOtherMethod(Class<?> clazz) {
System.out.println(clazz);
return new Object();
}
}
会打印出来
class A
(如果您创建A
)
如果SuperClass
有多个构造函数,则可以将结果分配给超类中的字段:
class SuperClass {
private final Object result = Manager.someOtherMethod(this.getClass());
SuperClass() { ... }
SuperClass(String someParameter) { ... }
}
然后result
将在两个构造函数中都可用。
答案 1 :(得分:1)
我建议你重构代码。
我假设你现在有A1
,A2
和A3
课程。
你应该像这样介绍工厂:
class AFactory {
public static A1 newA1() {return new A1(A1.class);}
public static A2 newA2() {return new A2(A2.class);}
public static A3 newA3() {return new A3(A3.class);}
}
向类A1
,A2
和A3
构造函数添加参数。
将参数添加到A
构造函数。
答案 2 :(得分:0)
......问题是什么?我是否理解正确,你是否希望将类分类,并且应该将该类赋予super,但是你不想在所有子类中调用super?
实际上它不能以这种方式完成,因为类对象尚未构造,因此它不存在。所以你不能在对象上调用方法,或者询问名称,或者无论如何。
我认为你被困在一个传递给超级的类,或者添加一个相当无用的public static class<? extends SuperClass> getThisClass() { ... }
或者我错过了一些不错的东西?如果我这样做,请评论,因为我实际上也想知道自己。
只是为了好奇,我尝试了不同的方法,在这里陈述:Getting the class name from a static method in Java但我最接近的是在中产阶级得到class test.staticgetclass.A
,但从来没有它的子类名称,我认为你想得到
答案 3 :(得分:0)
使用类文字作为构造函数参数
abstract class A extends SuperClass {
protected A(Class<? extends A> clazz) {
super(Manager.someOtherMethod(clazz));
}
然后在impl:
class B extends A {
public B() {
super(B.class);
}