我正在尝试声明一个方法,该方法将任何实现接口的类作为其参数。例如:
interface ICache {...}
class SimpleCache implements ICache {...}
void doSomething(Class<ICache> cls) { /* Do something with that class */ }
但是当我尝试用SimpleCache.class
调用它时,它不起作用。我该如何实现呢?
答案 0 :(得分:3)
如何更改方法签名
void doSomething(Class<? extends ICache> cls) {
答案 1 :(得分:2)
您需要引入一个类型参数:
<T extends ICache> void doSomething(Class<T> cls) { /* Do something with that class */ }
在Java中,a Class<B>
is not a Class<A>
even if B
inherits from A
。这就是为什么它不会在您的案例中使用SimpleCache.class
进行编译的原因:Class<SimpleCache>
不是Class<ICache>
。
因此,解决方案是引入类型T
:我们说这个方法可以使用任何类Class<T>
T extends ICache
。由于SimpleCache
尊重该界限,因此编译得很好。