[英]Trouble calling a non-static method from an abstract class
我正在尝试从SingleChoiceViewHolder.java中的SettingsItem.java调用getSetting()
。 有没有一种方法可以在保持SettingsItem
为非静态抽象类的同时调用getSetting()
? 这是我尝试添加到SingleChoiceViewHolder.java中的内容,但是Android Studio表示“ SettingsItem”是抽象的; 无法实例化:
SettingsItem instance = new SettingsItem(); instance.getSetting(); IntSetting setting = (IntSetting) getSetting(); mTextSettingDescription.setText(setting.getValue());
我也尝试过将SettingsItem转换为接口,并与SingleChoiceViewHolder extends SettingViewHolder
实现它SingleChoiceViewHolder extends SettingViewHolder
但原始问题仍然存在。
这些文件附在下面。
SingleChoiceViewHolder.java:
public final class SingleChoiceViewHolder extends SettingViewHolder { private SingleChoiceSetting mItem; private TextView mTextSettingName; private TextView mTextSettingDescription; public SingleChoiceViewHolder(View itemView, SettingsAdapter adapter) { super(itemView, adapter); } @Override protected void findViews(View root) { mTextSettingName = (TextView) root.findViewById(R.id.text_setting_name); mTextSettingDescription = (TextView) root.findViewById(R.id.text_setting_description); } @Override public void bind(SettingsItem item) { mItem = (SingleChoiceSetting) item; mTextSettingName.setText(item.getNameId()); if (item.getDescriptionId() == R.string.dynamic_descriptionId) { SettingsItem instance = new SettingsItem(); instance.getSetting(); IntSetting setting = (IntSetting) getSetting(); mTextSettingDescription.setText(setting.getValue()); } if (item.getDescriptionId() > 0 && item.getDescriptionId() != R.string.dynamic_descriptionId) { mTextSettingDescription.setText(item.getDescriptionId()); } } @Override public void onClick(View clicked) { getAdapter().onSingleChoiceClick(mItem); }
SettingsItem.java:
public abstract class SettingsItem { public static final int TYPE_HEADER = 0; public static final int TYPE_CHECKBOX = 1; public static final int TYPE_SINGLE_CHOICE = 2; public static final int TYPE_SLIDER = 3; public static final int TYPE_SUBMENU = 4; public static final int TYPE_INPUT_BINDING = 5; public static final int TYPE_RADIO_BUTTON = 6; private String mKey; private String mSection; private int mFile; private Setting mSetting; private int mNameId; private int mDescriptionId; public SettingsItem(String key, String section, int file, Setting setting, int nameId, int descriptionId) { mKey = key; mSection = section; mFile = file; mSetting = setting; mNameId = nameId; mDescriptionId = descriptionId; } public String getKey() { return mKey; } public String getSection() { return mSection; } public int getFile() { return mFile; } public Setting getSetting() { return mSetting; } public void setSetting(Setting setting) { mSetting = setting; } public int getNameId() { return mNameId; } public int getDescriptionId() { return mDescriptionId; } public abstract int getType(); }
按照定义,抽象类意味着它没有实例化,但是您可以从中继承。 如果要创建许多具有相同值但名称不同的对象,则可以扩展SettingsItem。
另外,如果您希望更多抽象以供将来使用,则可以使用与抽象方法相同的方法来创建接口,以防需要为其他设置项创建自定义方法。
例:
interface SettingsInterface {
void doSomething();
}
class abstract SettingsItem implements SettingsInterface {
public void doSomething() {
System.out.println("Hello");
}
}
class RegularSettings extends SettingsItem {}
class CustomSettings implements SettingsInterface {
public void doSomething() {
System.out.println("Goodbye");
}
}
class TestClass {
public static void testAbstract(SettingsItem extendedAbstract) {
extendedAbstract.doSomething();
}
public static void testInterface(SettingsInterface interface) {
interface.doSomething();
}
public static void main(String[] args) {
SettingsItem abstractExtended = new RegularSettings();
// also could be CustomSettings instead of SettingsInterface
SettingsInterface customClass = new CustomSettings();
testInterface(abstractExtended);
testInterface(customClass);
testAbstract(abstractExtended);
// will throw errors since it doesn't extend SettingsItem
testAbstract(customClass);
}
}
由于getSetting()不是静态方法,因此您需要在扩展抽象类SettingsItem的某些具体类的实例上调用它。
想一想。 如果您有一个此类的两个实例,并且两个实例的mSetting变量不同,则应该从对getSetting()的类似静态的调用中返回哪个实例?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.