Java instanceof в интерфейсе

#java #interface

#java #интерфейс

Вопрос:

У меня есть следующий код, касающийся параметров командной строки:

У меня есть эти классы:

 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 — это «class com.nim.tools.options.DwelltimeOptions», а класс DwelltimeOptions реализует IDwelltimeOptions, который расширяет IOptions…so DwelltimeOptions должен быть экземпляром IOptions.

На самом деле, я думаю, что я только что понял проблему. Переменная firstOption на самом деле является объектом класса и не может использоваться в контексте instanceof и не может сравниваться с интерфейсом, таким как IOptions?

Комментарии:

1. Это верно. Class.forName возвращает Class объект.

2. Правильно, вам нужно сделать firstOption = Class.forName("yada yada").newInstance(); , если вы хотите проверить это instanceOf .

3. @azurefrog IOption — это интерфейс, поэтому вы не можете создать новый экземпляр, используя этот подход.

4. Но он не получает класс для an IOption , он получает класс для a DwelltimeOptions , который реализует этот интерфейс. Вы не можете создать новый экземпляр enum?

5. @azurefrog о, не читал эту часть вопроса.

Ответ №1:

Class#forName возвращает экземпляр Class<?> , поэтому в этом коде:

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

Если аргумент, который вы передаете, args.get(0) I и у вас есть IOptions , то firstOption это то же Class<IOption> самое, что и, а не экземпляр объекта, который реализует IOption интерфейс.

Переменная firstOption на самом деле является объектом класса и не может использоваться в контексте instanceof и не может сравниваться с интерфейсом, таким как IOptions

Да, ваше предположение верно.

Ответ №2:

Да, Class.forName метод возвращает Class объект, представляющий класс, а не экземпляр класса. Таким образом, единственное, что instanceof вернется true , — это Class Object ) . Если вы хотите знать, реализует ли класс интерфейс (или суперкласс), и у вас есть соответствующие Class объекты, тогда вы можете использовать метод Class ‘s isAssignableFrom .

Определяет, является ли класс или интерфейс, представленный этим объектом класса, либо таким же, либо является суперклассом или суперинтерфейсом класса или интерфейса, представленных указанным параметром класса. Если это так, он возвращает true; в противном случае он возвращает false .

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