【发布时间】:2017-03-17 07:30:26
【问题描述】:
我有一个超类 SheetBuilder 和许多继承这个类的子类。 超类有一个所有类都继承的抽象方法。
protected abstract void printResults(String abc);
现在我想用不同的参数重载相同的方法,但我只需要为一个子类执行此操作。所以我改变了抽象方法如下,
protected abstract void printResults(Object abc);
这样我就可以用我想要接收的任何对象类型来实现我的子类,
子类实现:
protected void printResults(int abc) {
//
}
这是正确的标准还是有其他方法可以实现这一点?
【问题讨论】:
-
你的方法应该尽可能的具体,子类真的用任何类型的对象打印结果吗?
-
如果您创建了子类的实例,但将其称为超类的实例,然后调用
foo.printResults(new Object()),您会发生什么?那显然不能调用printResults(int)方法... -
ΦXocę 웃 Пepeúpa ツ :是的。我需要将不同类型的对象传递给每个子类。
-
Jon Skeet : foo.printResults(new Object()) 这永远不会发生,因为它被硬编码为 String 或 int。
-
int 甚至不是对象引用,而是原语,因此将父抽象方法参数声明为 Object 没有任何好处。即使 printResult(int) 和 printResult(X) (其中 X 是任何类)共享名称,它们实际上也是两个不同/独立的方法;当然,它们应该共享语义,因为它们共享相同的名称……这就是重载的“灵魂”。
标签: java generics inheritance covariance