接口上的Java instanceof

时间:2014-06-19 20:28:34

标签: java interface

我有以下代码处理命令行选项:

我有这些课程:

public enum DwelltimeOptions implements IDwelltimeOptions{

      public DwelltimeOptions findOption(String s){
             return null;
          }
 }

public interface IDwelltimeOptions extends IOptions{

    public void compare(ReconToolCompare rtc) throws ReconToolException;

}
public interface IOptions {

    public IOptions findOption(String s);

}

问题是我的firstOption变量似乎不是IOptions的实例,即使我认为它应该是。

Object firstOption = null;
        try {
             firstOption = Class.forName("com.nim.tools.options."  + capitalize(args.get(0)) + "Options");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        if(firstOption instanceof IOptions){
        secondOption = ((IOptions) firstOption).findOption(args.get(1).substring(1));
        }
        else{
            ReconTool.logError("Unrecognized option: \"" + args.get(0) + "\"");
            ReconTool.printOutOptions();
            System.exit(0);
        }

firstOption变量是"类com.nim.tools.options.DwelltimeOptions"并且DwelltimeOptions类实现扩展IOptions的IDwelltimeOptions ...所以DwelltimeOptions应该是IOptions的一个实例。

实际上,我想我刚刚意识到了这个问题。 firstOption变量实际上是一个Class对象,不能在上下文中使用,也不能与IOptions等接口进行比较?

2 个答案:

答案 0 :(得分:2)

Class#forName会返回Class<?>的实例,因此在此代码中:

firstOption = Class.forName("com.nim.tools.options."  + capitalize(args.get(0)) + "Options");

如果您在args.get(0)中传递的参数为IIOptions,则firstOptionClass<IOption>相同,而不是IOption的实例实现{{1}}接口的对象。

  

firstOption变量实际上是一个Class对象,不能在上下文的实例中使用,也不能与接口(如IOptions)进行比较

是的,你的假设是正确的。

答案 1 :(得分:1)

是的,Class.forName method返回表示类的Class对象,而不是类的实例。因此instanceof唯一会返回true的是Class(和Object)。如果您想知道该类是否实现了接口(或超类),并且您拥有相关的Class个对象,那么您可以使用Class's isAssignableFrom method

  

确定此Class对象表示的类或接口是否与指定的Class参数表示的类或接口相同,或者是它们的超类或超接口。如果是这样,它返回true;否则返回false。

if (IOptions.class.isAssignableFrom(firstOption)) {