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

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)更改为ApplicationCallback#doSomething(Base base)

有没有一种方法可以定义一种我可以定义的方法来防止代码在各处更改?

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

问题是关于@Override ApplicationCallback#doSomething()

最佳答案

您应该在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
  }
}

关于java - 通用方法输入类型的通用对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49943819/

10-10 13:36