通用方法输入通用对象类型

时间:2018-04-20 14:19:39

标签: java generics inheritance generic-programming

我正在重构代码......考虑这个继承链......

public class Base

public class Simple extends Base

public class Secure extends Simple

public class Framework extends Secure

public class Application extends Framework

和班级

public class ApplicationCallback

目前,ApplicationCallback使用此方法public abstract ApplicationCallback#doSomething(Application app),但我希望Base可以访问该方法....而无需将代码从ApplicationCallback#doSomething(Application app)更改为{{{} 1}}。

有没有办法可以定义一个我可以定义的方法来防止代码在任何地方发生变化?

有点像ApplicationCallback#doSomething(Base base),所以当覆盖时,我可以放ApplicationCallback#doSomething(T<? extends Base> app)ApplicationCallback#doSomething(Base base)等等。

问题是关于ApplicationCallback#doSomething(Simple simple)

1 个答案:

答案 0 :(得分:1)

您应该在ApplicationCallback类上引入通用参数。这允许您定义仅采用某些子类型的回调:

class Callback<T extends Base> { abstract void doSomething(T t); }

这将允许您使用您定义的子类型中的方法,例如,如果Secure类添加了getSecureThing()功能,您可以:

Callback<Base> base = new Callback<Base>() { 
  void doSomething(Base base) {
    // getSecureThing not available
  }
}
Callback<Application> app = new Callback<Application>() { 
  void doSomething(Application app) {
    // app.getSecureThing is available
  }
}