我有一个方法,它将泛型类接口作为参数,我想检查提供的接口是否扩展了某个基类,如果不是,我会抛出异常。是否可以做类似的事情:
public void genericMethod(Class<T> c) {
if (!(c instanceof baseClass)) {
throw new Exception("Must be instance of base class");
}
}
即使有可能,它会被视为良好做法吗?或者java泛型是否遵循ducktyping
的相同原则?
答案 0 :(得分:5)
您可以使用 Class.isAssignableFrom
:
if (baseClass.isAssignableFrom(c)) {
...
}
此代码假定baseClass
是Class
类型的变量(字段,局部变量,等等)。如果baseClass
是类的名称(这将违反Java约定),则使用baseClass.class
代替,如Pshemo在评论中所建议的那样。
来自文档:
确定此Class对象所表示的类或接口是否与指定的Class参数所表示的类或接口相同,或者是它们的超类或超接口。
答案 1 :(得分:3)
解决问题的核心部分;当你走上仿制药的道路时,如果你刚才有了它会更好看:
public void genericMethod(Class<? extends BaseClass> c) {
// do what you want
}
?
通配符告诉编译器只有BaseClass
的子类是可接受的参数,基本上是为你执行instanceOf
检查。
这几乎消除了在编译期间滥用方法的可能性
另见