一个小小的打嗝引发了我一个基本的问题。我打算在以下案例中检查班级对等(学术好奇心 - 请不要指示我instanceof
或isinstance
):
public class staticChild extends staticParent{
....
public static void main(String[] args){
staticChild thisobj=new staticChild();
System.out.println(thisobj.getClass()==staticParent.class);
}
}
这会产生编译错误:
error: incomparable types: Class<CAP#1> and Class<staticParent>
System.out.println(thisobj.getClass()==staticParent.class);
where CAP#1 is a fresh type-variable: CAP#1 extends staticChild from capture of ? extends staticChild
答案 0 :(得分:2)
由于thisobj
被声明为staticChild
类型,因此表达式为:
thisobj.getClass()
返回Class<? extends staticChild>
类型的对象。您正在尝试将其与类型为Class<staticParent>
的对象进行比较,但编译器无法匹配泛型类型参数。它知道staticParent
无法扩展staticChild
所以它无法分配给?
中的Class<? extends staticChild>
。
有几种方法可以消除错误。例如,您可以将thisobj
声明为Object
类型(甚至类型为staticParent
)。
但请注意,测试将始终失败。
答案 1 :(得分:1)
如果无法转换类型,则为编译时错误 通过转换转换将操作数转换为另一个的类型 (§5.5)。两个操作数的运行时值必然是 不相等的。
在此上下文中,类型和类之间没有区别。
不要尝试比较两个不可相互转换的对象。在这种情况下,您要将Class<CAP#1>
与Class<staticParent>
进行比较。但是,如果您想“修复”错误,则可以使用.equals
代替,并了解它始终会返回false
。
System.out.println(thisobj.getClass().equals(staticParent.class));
答案 2 :(得分:1)
编译器已经足够聪明,可以说类不等同。它假设你正在编写一个通常的程序,而不是解决学术任务,并尽力提供帮助。
如果您仍然需要手动执行此操作&#34;由于学术好奇心&#34;,请将它们分配给类型为Class的常规变量:
Class a = staticChild.class;
Class b = staticParent.class;
if (a == b) // false
(将显示&#34;原始类型&#34;警告但应该编译)。
Object x = a.newInstance();
Object y = b.newInstance();
休息取决于你。
答案 3 :(得分:0)
这意味着您的代码中存在错误。
错误表示您的类型不兼容。是的,您可以从错误消息中看到它,但是不兼容的类型。您正在通过“==”比较两个类。
如果您要检查thisobj是否是staticParent的实例,那么您应该使用:
System.out.println(thisobj instanceof staticParent);
但具体而言,错误是因为您正在基于两个永远不会相等的类运行true / false的比较。