继承中的协方差

Covariance in inheritance

我有一个超级 class SheetBuilder 和许多继承此 class 的子 classes。 super class 有一个所有 classes 继承的抽象方法。

protected abstract void printResults(String abc);

现在我想用不同的参数重载相同的方法,但我只需要对一个子程序执行此操作 class。所以我改变了抽象方法如下,

protected abstract void printResults(Object abc);

这样我就可以用我想要接收的任何对象类型来实现我的子 class,

子 class 实现:

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?

不,对象太宽。从客户端,如果你想通过接口编程,你必须调用这个 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)是针对单个class的,只在这个class.
中添加这个方法 在这种情况下,您无法通过接口编程来调用此方法,因为此方法特定于 class.
但如果方法是具体的,那是可以接受的,有时甚至是可取的。

另一种解决问题的方法是使用泛型方法创建一个基础 class,根据具体 class,参数可能具有不同的类型,使用泛型:

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) {
   ...
  }
}