You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Object类型引用Rational对象时compareTo()为何触发运行时错误?

问题底层原因分析

核心原因:Java的静态类型检查机制

Java是静态类型语言,编译阶段会严格依据变量的**声明类型(静态类型)**来校验方法调用的合法性:

  • 当你用Object r2 = new Rational(1,45)声明变量时,r2的静态类型是Object,而Java的Object类本身并没有定义compareTo()方法,所以编译器在检查第12行的r2.compareTo(r1)时,会直接判定该调用不合法,要么编译报错,要么运行时抛出NoSuchMethodError。
  • 当你把r2声明为Rational类型时,编译器明确知道Rational类(应该实现了Comparable<Rational>接口)拥有compareTo()方法,因此编译阶段就能通过校验,运行时也能正确调用Rational类中实现的compareTo()逻辑。

解决办法(如果要保留Object声明)

如果必须用Object类型声明r2,需要先对r2做显式类型转换,告诉编译器它实际是Rational类型,代码修改如下:

public static void main(String[] args) {
    
    Rational r1 = new Rational(-2, 6);
    System.out.println(r1.getNumerator());
    System.out.println(r1.getDenominator());
    System.out.println(r1.intValue());
    System.out.println(r1.doubleValue() + "\n");
    
    Object r2 = new Rational(1,45);
    // 显式转换为Rational类型后调用方法
    System.out.println(((Rational)r2).compareTo(r1));
    
}

内容的提问来源于stack exchange,提问作者ProgrammingStudent

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 05:27:07