我正在编写一个方法,要求其中一个参数来自特定的类(MyClass
)并实现一个接口(MyInterface
)。
这样做的粗略方法是
public void doStuff(MyClass arg0) {
if (!(arg0 instanceof MyInterface))
throw new IllegalArgumentException("arg0 must implement MyInterface");
// do whatever we need to do
}
请注意,MyClass
未实现MyInterface
,并且两者都是我导入的类。
有没有更优雅的方法,最好是在构建时标记错误的方法?
答案 0 :(得分:5)
您可以使用以下通用方法执行此操作:
public <T extends MyClass & MyInterface> void doStuff(T arg) { ... }
假设以下类(和接口)
class MyClass {}
interface MyInterface {}
class A extends MyClass {}
class B implements MyInterface {}
class C extends MyClass implements MyInterface {}
以下两个语句都是非法的(编译器错误)
doStuff(new A());
doStuff(new B());
而以下语句将编译
doStuff(new C());
有关somehwat怪异类型变量声明的更多信息,请参阅JLS §4.4 (Type Variables)。