Java 当不推荐使用默认构造函数时,如何调用父类的构造函数

Java 当不推荐使用默认构造函数时,如何调用父类的构造函数,java,android,constructor,deprecated,android-8.0-oreo,Java,Android,Constructor,Deprecated,Android 8.0 Oreo,我有一个名为BaseKeyListener的类,它扩展了android.text.method.DigitsKeyListener。我没有在BaseKeyListener类中定义构造函数,因此调用了父类的默认构造函数 从api级别26开始,DigitsKeyListener的默认构造函数为。为了仍然支持较低的Android版本,我必须向BaseKeyListener添加一个构造函数,有条件地调用父级的构造函数。但是,这会导致另一个错误 public static abstract class B

我有一个名为BaseKeyListener的类,它扩展了android.text.method.DigitsKeyListener。我没有在BaseKeyListener类中定义构造函数,因此调用了父类的默认构造函数


从api级别26开始,DigitsKeyListener的默认构造函数为。为了仍然支持较低的Android版本,我必须向BaseKeyListener添加一个构造函数,有条件地调用父级的构造函数。但是,这会导致另一个错误

public static abstract class BaseKeyListener extends DigitsKeyListener
{
    public BaseKeyListener()
    {
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
        {
            // api level 26 constructor
            super(null);
        }
        else 
        {
            // api level 1 constructor (deprecated)
            super(); 
        } 
    }
}
我现在遇到的错误是:

对“super()”的调用必须是构造函数体中的第一条语句

我尝试了一个简短的if语句,但也没有奏效。 有api级别1的构造函数,但不幸的是,它也被弃用了。
如何修复这些错误?

我会这样想:

/**
 * only use this if you want to use api level 1
 */
public BaseKeyListener() {
  super(); // implicitly added already
}

/**
 * only use this if you want to use api level 26
 * and add if condition before calling this constructor
 */
public BaseKeyListener(Obect param) {
  super(param);
}

我会这样想:

/**
 * only use this if you want to use api level 1
 */
public BaseKeyListener() {
  super(); // implicitly added already
}

/**
 * only use this if you want to use api level 26
 * and add if condition before calling this constructor
 */
public BaseKeyListener(Obect param) {
  super(param);
}

API 26+和中仍然存在不推荐使用的构造函数。您可以只重写默认构造函数,也可以同时重写这两个构造函数并添加一个静态方法来调用正确的构造函数,具体取决于它运行在哪个版本的Android上

选项1-默认构造函数 选项2-两个私有构造函数
API 26+和中仍然存在不推荐使用的构造函数。您可以只重写默认构造函数,也可以同时重写这两个构造函数并添加一个静态方法来调用正确的构造函数,具体取决于它运行在哪个版本的Android上

选项1-默认构造函数 选项2-两个私有构造函数
“我必须向BaseKeyListener添加一个构造函数,有条件地调用父级的构造函数。”这是不可能的。父级的构造函数始终是called@salman我们这里说的是构造函数,这不适用于“我必须向BaseKeyListener添加一个构造函数,有条件地调用父级的构造函数。”这是不可能的。父级的构造函数始终是called@salman我们在这里讨论的是构造函数,这并不适用。我没想到第一个解决方案会起作用,但它确实起作用。我选择了选项一,因为代码更改很少。很高兴您添加了一个替代解决方案。我没想到第一个解决方案会起作用,但它确实起作用了。我选择了选项一,因为代码更改很少。很高兴您添加了一个替代解决方案。
public static abstract class BaseKeyListener extends DigitsKeyListener {
  private BaseKeyListener() {
    super(); 
  }

  private BaseKeyListener(Locale locale) {
    super(locale);
  }

  public static BaseKeyListener newInstance(Locale locale) {
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
      return new BaseKeyListener(locale);
    } else {
      return new BaseKeyListener();
    }
  }
}