是否可以评估类接口是否扩展某个基类?

时间:2013-07-05 01:19:51

标签: java generics

我有一个方法,它将泛型类接口作为参数,我想检查提供的接口是否扩展了某个基类,如果不是,我会抛出异常。是否可以做类似的事情:

public void genericMethod(Class<T> c) {
    if (!(c instanceof baseClass)) {
        throw new Exception("Must be instance of base class");
    }
}

即使有可能,它会被视为良好做法吗?或者java泛型是否遵循ducktyping的相同原则?

2 个答案:

答案 0 :(得分:5)

您可以使用 Class.isAssignableFrom

if (baseClass.isAssignableFrom(c)) {
  ...
}

此代码假定baseClassClass类型的变量(字段,局部变量,等等)。如果baseClass是类的名称(这将违反Java约定),则使用baseClass.class代替,如Pshemo在评论中所建议的那样。

来自文档:

  

确定此Class对象所表示的类或接口是否与指定的Class参数所表示的类或接口相同,或者是它们的超类或超接口。

答案 1 :(得分:3)

解决问题的核心部分;当你走上仿制药的道路时,如果你刚才有了它会更好看:

       public void genericMethod(Class<? extends BaseClass> c) {
          // do what you want
        }

?通配符告诉编译器只有BaseClass的子类是可接受的参数,基本上是为你执行instanceOf检查。

这几乎消除了在编译期间滥用方法的可能性

另见