Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重写派生类中已重写的方法_Java_Android - Fatal编程技术网

Java 重写派生类中已重写的方法

Java 重写派生类中已重写的方法,java,android,Java,Android,我有一个类CarSettingsAdapter,它扩展了FragmentStatePagerAdapter。 在该类中,我有一个重写的方法,该方法返回CarSettings类型的项 @Override public CarSettings getItem(int position) { return carSettingsList.get(position); } 现在,我创建了一个扩展classCarSettingsAdapter的新类,但我希望它返回我自己的

我有一个类
CarSettingsAdapter
,它扩展了
FragmentStatePagerAdapter
。 在该类中,我有一个重写的方法,该方法返回CarSettings类型的项

@Override
    public CarSettings getItem(int position) {
        return carSettingsList.get(position);
    }
现在,我创建了一个扩展class
CarSettingsAdapter
的新类,但我希望它返回我自己的类型,比如说
MyTypeB

public class NewCarSettings extends CarSettings {

@Override
    public MyTypeB getItem(int position) {
        return typeBList.get(position);
    }
}
我无法覆盖它,我收到一个编译错误-
返回类型与CarSettingsAdapter.getItem(int)
不兼容


我想使用
CarSettingsAdapter
的所有逻辑,这就是我扩展它的原因,但也要覆盖基本方法。我该怎么做呢?

您可以创建一个使用泛型的中间类。例如,
CustomSettingsAdapter扩展了FragmentStatePagerAdapter

这样,您的
getItem()
方法可以返回
T

然后将公共逻辑放入该类中,并创建如下新类:

  • CarSettingsAdapter扩展了CustomSettingsAdapter
  • NewCarSettingsAdapter扩展了CustomSettingsAdapter

如果您更改了方法签名,根据定义,您并没有覆盖它,而是创建了一个新方法。NewTypeB的类型层次结构是什么?只有当它是CarSettings的子类型时,这才起作用。@并且返回否
NewTypeB
不是
CarSettings
的子类型。那么,我如何扩展类
CarSettingsAdapter
并添加一些更改。。。我不想把95%的代码复制到我的新class@AlexOpent好吧,没有什么可以阻止您添加一个方法,该方法将返回一个
MyTypeB
,但是它不能被调用
getItem
,或者它必须具有不同的参数。但是,如果要覆盖该方法,则必须返回
CarSettings
或其子类型之一。此限制的原因是,您可以将
NewCarSettings
的实例传递给任何需要
CarSettings
实例的方法,如果调用
getItem
,则该方法需要返回
CarSettings
的实例。如果您能够返回任何其他类型,您将得到一个
ClassCastException
。您不能使用另一个方法
getMyNewItem()
来返回新值吗?您不能在his中使用多态性,但您仍然继承了
CarSettingsAdapter
(或者)您可以将
MyTypeB
作为
CarSettings
的子类(或者)如果您有权访问
FragmentStatePagerAdapter
,您可以将
getItem()的
返回类型更改为
对象。最后一个只是一个解决方案,不是一个好的设计解决方案,尽管您必须进行一些
实例检查,以了解从该方法获得的对象