【问题标题】:Overloading not behaving as expected重载未按预期运行
【发布时间】:2021-03-23 16:15:22
【问题描述】:

我正在创建一个酒店,我的客户存储在树形结构中,因此可以轻松搜索。

我的 Client 类有 2 个 compareTwo 方法。一个用于将客户端与另一个客户端进行比较,另一个用于将其与 int 进行比较。 Client 应该是可比较的类型,因为它位于实现 Comparable 的树结构中。

//compare Client to int
public int compareTo(int arg0) {
int result = this.clientId.compareTo(arg0);
return result;
}

//compare Client to object
public int compareTo(Object o) {
return (this.clientId).compareTo(((Client)o).clientId);
}

但它并没有达到预期的效果。每次调用此函数时,它都会使用 compareTo(Object) 方法并返回我的 int 无法转换为客户端的错误。我想这是因为 Object 是 int(?) 的超类,但不太知道如何修复它。我尝试解决此问题,但似乎无法在不更改我的整个代码的情况下解决它。

感谢您的帮助!

【问题讨论】:

  • 哪里有问题的代码?
  • 正如@akuzminykh 所说,您展示的代码本质上没有任何问题。我们需要看看你是如何尝试使用它的——这就是问题所在。

标签: java class casting overloading


【解决方案1】:

Java 的 TreeMapTreeSet 使用 compareTo(T) 方法(即,对于您似乎正在使用的原始类型,compareTo(Object),因此您的重载方法将被忽略。

虽然您当然可以重载 compareTo 方法,但不能强制 Java 的数据结构使用它。

一种可能的方法是让compareTo(Object) 方法动态检查类型:

//compare Client to object
public int compareTo(Object o) {
    Integer toCompare;
    if (o instanceof Client) {
        toCompare = ((Client) o).clientId;
    } else if (o instanceof Integer) {
        toCompare = (Integer) o;
    } else {
        throw new IllegalArgumentException();
    }

    return (this.clientId).compareTo(toCompare);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 2020-06-28
    • 2012-02-18
    相关资源
    最近更新 更多