我有一个名为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();
}
}
}
我现在遇到的错误:
对“ super()”的调用必须是构造函数主体中的第一条语句
我尝试了一个简写的if语句,但这也没有解决问题。 曾经有another个api级别1构造函数,但不幸的是它也已被弃用。 我该如何解决这些错误?
答案 0 :(得分: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);
}
答案 1 :(得分:1)
API 26+和passing in a null locale is the same as calling the default constructor anyway中仍然存在不建议使用的构造函数。您可以覆盖默认的构造函数,也可以覆盖两者,然后添加静态方法来调用正确的构造函数,具体取决于运行的Android版本。
public static abstract class BaseKeyListener extends DigitsKeyListener {
public BaseKeyListener() {
super();
}
}
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();
}
}
}