1

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

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

即使有可能,这是否被认为是好的做法?或者java泛型应该遵循相同的原则ducktyping吗?

4

2 回答 2

5

您可以使用Class.isAssignableFrom

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

此代码假定它baseClass是一个类型为 的变量(字段、局部变量等)Class。IfbaseClass是一个类的名称(这将违反 Java 约定),然后baseClass.class按照 Pshemo 在评论中的建议使用。

从文档中:

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

于 2013-07-05T01:20:59.820 回答
3

解决您问题的核心部分;当您走泛型的道路时,如果您拥有以下内容会更好看:

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

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

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

也可以看看

于 2013-07-05T01:30:50.487 回答