如何在Java中的方法签名中使用Class <interface>

时间:2016-01-31 23:11:49

标签: java interface

我正在尝试声明一个方法,该方法将任何实现接口的类作为其参数。例如:

interface ICache {...}
class SimpleCache implements ICache {...}

void doSomething(Class<ICache> cls) { /* Do something with that class */ }

但是当我尝试用SimpleCache.class调用它时,它不起作用。我该如何实现呢?

2 个答案:

答案 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尊重该界限,因此编译得很好。