
本文旨在深入解析 Java 中类类型比较时出现的 "non comparable type" 编译错误。通过具体示例,我们将探讨 getClass() 方法的返回值类型,以及为何某些类类型之间的直接比较会导致编译失败。理解这些概念有助于编写更健壮、类型安全的代码。
在 Java 中,使用 == 运算符比较对象时,编译器会进行类型检查。当比较的两个对象类型明显不兼容时,编译器会抛出 "non comparable type" 错误。这通常发生在尝试比较两个毫不相关的类类型时。
以下面的代码为例:
class A {}
class B extends A {}
public class Test {
public static void main(String[] args) {
A a = new A();
B b = new B();
Class<? extends A> aClass = a.getClass();
Class<? extends B> bClass = b.getClass();
System.out.println(aClass == B.class); // #3 不会报错
System.out.println(bClass == A.class); // #4 报错: java: non comparable type: java.lang.Class<capture#1, ? extends Test.B> and java.lang.Class<Test.A>
}
}这段代码中,aClass 的类型是 Class extends A>,表示它是 A 的某个子类。bClass 的类型是 Class extends B>,表示它是 B 的某个子类。
立即学习“Java免费学习笔记(深入)”;
为什么 #4 会报错?
关键在于类型推断。编译器知道 bClass 是 B 的某个子类,而 A.class 代表 A 类本身。如果 bClass == A.class 成立,意味着 A 必须是 B 的子类,这与 B 继承自 A 的事实相矛盾。因此,编译器认为这种比较没有意义,直接报错。
这本书给出了一份关于python这门优美语言的精要的参考。作者通过一个完整而清晰的入门指引将你带入python的乐园,随后在语法、类型和对象、运算符与表达式、控制流函数与函数编程、类及面向对象编程、模块和包、输入输出、执行环境等多方面给出了详尽的讲解。如果你想加入 python的世界,David M beazley的这本书可不要错过哦。 (封面是最新英文版的,中文版貌似只译到第二版)
9
为什么 #3 不会报错?
aClass == B.class 的比较是合理的。aClass 是 A 的某个子类,而 B 也是 A 的子类,所以 aClass 有可能是 B。
考虑以下情况:
A a = new B(); Class<? extends A> aClass = a.getClass(); System.out.println(aClass == B.class); // 输出 true
在这个例子中,a 实际上是 B 的一个实例,因此 aClass 实际上是 B.class。
总结和注意事项
理解这些概念可以帮助我们避免在 Java 中出现 "non comparable type" 编译错误,并编写更健壮、类型安全的代码。在进行类类型比较时,务必仔细考虑类型之间的关系,确保比较的合理性。
以上就是Java 类类型比较编译错误:不可比较类型详解的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号