java - 继承中的协方差

标签 java generics inheritance covariance

我有一个父类(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/

相关文章:

c++ - 在派生类的方法中使用基类的方法

java - 使用 JNA-Ptrace 在 Linux 中获取有关外部进程的信息?

java - 为什么在这个泛型方法中这些变量有不同的类型?

java - 如何避免在 Java 泛型扩展 Comparable 接口(interface)中进行未经检查的强制转换?

c# - 在 C# 中访问泛型类的静态方法

c# - 接口(interface) C# 的类层次结构

java - Playframework 2.5.0 : Unable to serve server-side generated zip file

java - 动态删除所有按钮

java - 如何在 Tomcat 上运行 Java 应用程序?

c# - Java通过反射创建通用Arraylist