我有一个父类(super class) SheetBuilder 和许多继承该类的子类。 父类(super class)有一个所有类都继承的抽象方法。
protected abstract void printResults(String abc);
现在我想使用不同的参数重载相同的方法,但我只需要为一个子类执行此操作。所以我改变了抽象方法如下,
protected abstract void printResults(Object abc);
这样我就可以用我想要接收的任何对象类型来实现我的子类,
子类实现:
protected void printResults(int abc) {
//
}
这是正确的标准还是有其他方法可以实现这一目标?
最佳答案
protected abstract void printResults(Object abc);
Now I want to overload the same method with a different parameter but I need to do this only for one sub class. So I changed the abstract method as below, Is this the correct standard or this there any other way to achieve this?
不,对象太宽。从客户端,如果您想通过接口(interface)进行编程,则必须调用此 printResults(Object abc);
。
并且您可以将任何类型的实例放入其中。
此外,我认为您混合了重写和重载。这是重载而不是重写,因为重写无法更改声明的参数类型:
class Base{
protected abstract void printResults(Object abc);
}
...
class BaseImpl{
protected void printResults(String abc) {
...
}
}
这里BaseImpl有两个方法printResults()。
如果在BaseImpl方法中添加@Override,编译会失败,因为不是同一个方法:
class Base{
protected abstract void printResults(Object abc);
}
...
class BaseImpl{
@Override
protected void printResults(String abc) {
...
}
}
要回答您的问题,如果 void printResults(String abc)
特定于单个类,则仅在此类中添加此方法。
在这种情况下,您无法通过接口(interface)编程来调用此方法,因为此方法特定于类。
但如果方法具体,是可以接受的,有时甚至是可取的。
解决问题的另一种方法是创建一个具有泛型方法的基类,该方法的参数可能根据具体类具有不同的类型,请使用泛型:
class Base <T>{
protected abstract void printResults(T abc);
}
...
class BaseStringImpl<String>{
@Override
protected void printResults(String abc) {
...
}
}
...
class BaseIntegerImpl<Integer>{
@Override
protected void printResults(Integer abc) {
...
}
}
关于java - 继承中的协方差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42851656/