指定 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 */
}
我正在编写一个方法,该方法将 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 */
}