【发布时间】:2019-10-08 20:33:12
【问题描述】:
让我用一个例子来描述我的意图,
class Base {
public void sayHi() {
System.out.println("Hi");
}
}
class ChildOne extends Base {
public void sayBye() {
System.out.println("Bye-1");
}
}
class ChildTwo extends Base {
public void sayBye() {
System.out.println("Bye-2");
}
}
public class MainClass {
public static <T extends Base> void genericFunction(T child) {
child.sayBye();
}
public static void main(String[] args) {
ChildOne childOne = new ChildOne();
ChildTwo childTwo = new ChildTwo();
genericFunction(childOne);
genericFunction(childTwo);
}
}
此代码错误。但我的意图是子类(项目中一些已经存在的类)它们之间具有相似的属性,它们扩展了基类并具有 sayBye() 成员函数。
有没有办法将所有子类作为参数传递给泛型函数并调用成员函数 sayBye()(根据本例)?
【问题讨论】:
-
不,不使用当前的代码结构。两个 Childs 中的
sayBye方法完全没有任何关系。他们同名的事实并不重要,这只是“巧合”。您需要将函数上移到 Base 类中,使其抽象化,然后在 Child 类中实现。 -
为什么不让他们实现一个接口?
-
sayBye()方法可用于ChildOne及其子类;将签名更改为void genericFunction(ChildOne child)。或者,正如@MrHug 建议的那样,将您需要的方法放在接口中。 -
是的,我知道如何通过接口和将代码抽象为基类等方式使其成为可能。但它们是不同包中的一些现有代码(基类),我不想碰它们。只是想知道是否有可能以其他方式制作。但无论如何,谢谢!
-
那么答案是:没有。