我有以下代码处理命令行选项:
我有这些课程:
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等接口进行比较?
答案 0 :(得分:2)
Class#forName
会返回Class<?>
的实例,因此在此代码中:
firstOption = Class.forName("com.nim.tools.options." + capitalize(args.get(0)) + "Options");
如果您在args.get(0)
中传递的参数为I
且IOptions
,则firstOption
与Class<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)) {