java - 当默认构造函数被弃用时如何调用父类的构造函数

标签 java android constructor deprecated android-8.0-oreo

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

从 API 级别 26 开始,DigitsKeyListener 的默认构造函数为 deprecated 。为了仍然支持较低的 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(); 
        } 
    }
}

我现在遇到的错误:

Call to 'super()' must be first statement in constructor body

我尝试了简写 if 语句,但这也没有成功。 有another api level 1 构造函数,但不幸的是它也已被弃用。 我该如何修复这些错误?

最佳答案

已弃用的构造函数在 API 26+ 和 passing in a null locale is the same as calling the default constructor anyway 中仍然存在。您可以只重写默认构造函数,也可以重写两者并添加一个静态方法来调用正确的构造函数,具体取决于运行的 Android 版本。

选项 1 - 默认构造函数

public static abstract class BaseKeyListener extends DigitsKeyListener {
  public BaseKeyListener() {
    super(); 
  }
}

选项 2 - 两个私有(private)构造函数

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

关于java - 当默认构造函数被弃用时如何调用父类的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51299553/

相关文章:

调用事件后,javascript 构造函数属性变为未定义

java - 如何将外部 Java 应用程序中的对象放入 MB 队列中?

android - ionic 构建Android |错误 : No installed build tools found. 请安装 Android 构建工具

c++ - 我一直收到 -2 作为我的更新工资

constructor - 使用 defrecord 构造函数调用 apply?

android - 如何在android应用程序中保存变量的状态并使用它

java - keylistener 和 runnable 不工作

java - 将子类对象添加到数组列表中,同时不允许父类(super class)对象进入列表

java - 如果我有 1M 到 10M 的标记,使用 HashMap 是否错误?

Android文件加密错误