是否可以在调用super()之前访问this.getClass()

时间:2016-09-02 13:34:08

标签: java constructor

我想在使用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

提前感谢您的答案:)

4 个答案:

答案 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

的实例

Ideone demo

如果SuperClass有多个构造函数,则可以将结果分配给超类中的字段:

class SuperClass {
  private final Object result = Manager.someOtherMethod(this.getClass());

  SuperClass() { ... }

  SuperClass(String someParameter) { ... }
}

然后result将在两个构造函数中都可用。

答案 1 :(得分:1)

我建议你重构代码。

我假设你现在有A1A2A3课程。

你应该像这样介绍工厂:

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);}
}

向类A1A2A3构造函数添加参数。

将参数添加到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);
    }