#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
, он получает класс для aDwelltimeOptions
, который реализует этот интерфейс. Вы не можете создать новый экземпляр 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)) {