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

问题描述 投票:1回答:1

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

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()

java generics inheritance generic-programming
1个回答
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
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.