指定 Class 参数必须实现特定接口

Specify that a Class argument must implement a particular interface

我正在编写一个方法,该方法将 Class 作为参数传递,如下所示:

public void doStuff(Class<?> clazz) {
    /* do stuff */
}

然后我可以这样调用方法:

doStuff(FooBar.class);

如何在编译器级别强制参数只能是实现特定接口的 class?

我尝试了以下方法——

public <T extends FooInterface> void doStuff(Class<T> clazz) {
    /* do stuff */
}

—但是对于以下语句会出现编译器错误:

doStuff(FooBar.class); // FooBar implements FooInterface

如何正确执行此操作?

我试过你的说法,但它似乎有效。请看下面的代码。我不知道确切的 class 定义,但在这种情况下

t.doStuff(Foo.class)

有效但是

t.doStuff(Faa.class)

没有

public class Test{
public <T extends FooInterface> void doStuff(Class<T> clazz) {
    /* do stuff */
}

public static void main(String[] args) {
    Test t = new Test();
    t.doStuff(Foo.class); //This one compiles fine
    //g.doStuff(Faa.class);  <-- This line gives error
}
}

interface FooInterface{

}

class Foo implements FooInterface{

}

class Faa{

}

事实证明我尝试的代码实际上是正确的,编译器错误(即 Eclipse 以红色下划线显示调用)是调用周围缺少 try/catch 块的结果。

有两种可能的方法可以达到预期的效果:

public <T extends FooInterface> void doStuff(Class<T> clazz) {
    /* do stuff */
}

或者,不那么详细:

public void doStuff(Class<? extends FooInterface> clazz) {
    /* do stuff */
}