如何解决问题:int无法解引用

2023-12-09

这里我有一些值,其中两个是整数,并且我无法对它们调用方法,因为它们不是引用。我该如何解决这个问题?

String srcAddr, dstAddr, protocol;
int srcPort, dstPort;

public int hashCode() {

        final int prime = 31;
        int result = 1;
        result = prime * result + ((dstAddr == null) ? 0 : dstAddr.hashCode());
        result = prime * result + ((dstPort == null) ? 0 : dstPort.hashCode());
        result = prime * result + ((srcAddr == null) ? 0 : srcAddr.hashCode());
        result = prime * result + ((srcPort == null) ? 0 : srcPort.hashCode());
        return result;

}

另外,我也有一个 equal 方法,其错误的一部分如下所示,与上面相同,我无法将 int 与 null 进行比较。

@Override
public boolean equals(Object obj) {

    if (srcPort == null) {
        if (other.srcPort != null)
            return false;
    } else if (!srcPort.equals(other.srcPort))
        return false;

    if (srcPort == null) {
        if (other.srcPort != null)
            return false;
    } else if (!srcPort.equals(other.srcPort))
        return false;
}

我该如何解决这个错误?


Writing hashcode and equals可能很乏味和/或容易出错,而 Eclipse 等 IDE 实际上可以为您自动执行此任务。有许多第三方库也可以促进此功能。

要使用标准库中的某些内容,我建议执行以下操作:

import java.util.Arrays;

// conveniently packs varargs to array 
private static Object[] pack(Object... objs) {
   return objs;
}

private Object[] fieldsAsArray() {
   return pack(srcAddr, dstAddr, protocol, srcPort, dstPort);
}

@Override public int hashCode() {
   return Arrays.hashCode(this.fieldsAsArray());
}

@Override public boolean equals(Object o) {
   // TODO: instanceof check, cast and assign o to other

   return Arrays.equals(this.fieldsAsArray(), other.fieldsAsArray());
}

这使用varargs, 自动装箱, and java.util.Arrays数组的相等性和哈希码的实用方法实现。这将具有足够的(尽管可能不是最佳的)性能,但代码简洁且可读,并且可以在必要时随时进行优化。


第三方库选项

From 阿帕奇公共语言, 您可以使用EqualsBuilder and HashCodeBuilder.

该文档有典型用法的示例:

@Override public boolean equals(Object obj) {
   if (obj == null) { return false; }
   if (obj == this) { return true; }
   if (obj.getClass() != this.getClass()) {
     return false;
   }
   MyClass other = (MyClass) obj;
   return new EqualsBuilder()
                 .appendSuper(super.equals(obj))
                 .append(field1, other.field1)
                 .append(field2, other.field2)
                 .append(field3, other.field3)
                 .isEquals();
}

@Override public int hashCode() {
   return new HashCodeBuilder(17, 37)
                 .append(field1)
                 .append(field2)
                 .append(field3)
                 .toHashCode();
} 

生成的代码非常可读、易于维护并且不易出错。

相关问题

  • 在 Java 中重写 equals 和 hashCode
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何解决问题:int无法解引用 的相关文章

随机推荐

  • 获取当前 YouTube 视频时间

    我正在编写一个浏览器插件 需要找到一种方法来使用 JavaScript 获取 YouTube 视频在 YouTube 上播放的当前时间 我一直在 Chrome JavaScript 控制台中尝试 但没有任何运气 chrome API 似乎仅
  • 将字符串转换为整数 val

    如果我的字符串包含 100 位或 900 位数字 我如何将其解析为整数值 Java public static void main String args long answer1 1 answer2 1 Scanner sc new Sc
  • “绘制图像没有意义” - 升级到 MountainLion 后警告

    将编程机升级到 MountainLion 并将 XCode 升级到新版本后 每次运行应用程序时 我都会在控制台中打印此警告 当 NSGraphicsContext currentContext 为零 这是一个编程错误 无效时中断 NSWar
  • 使用jquery防止汉字输入

    如何防止使用jquery输入汉字 validator addMethod regex function value element regexp var check false return this optional element re
  • 使用 postgres.app 在 rvm 下需要 pg 时出错

    我在用着Postgres app在 OS X 10 8 3 上 我已经修改了我的PATH所以这样bin该应用程序的文件夹位于所有其他文件夹之前 Rammy phrogz which pg config Applications Postgr
  • 将换行符替换为文字 \n

    这个计算器问题有一个用 sed 替换换行符的答案 使用格式 sed a N ba s n g 这有效 但不适用于 r n 等特殊字符 我想做的是将换行符替换为文字 n 尝试过 sed a N ba s n n g and sed a N b
  • 错误:java: javacTask: 源版本 8 需要目标版本 1.8

    使用IntelliJ IDE无法编译任何项目 设置截图如下 使用的JDK 项目SDK和语言级别 语言水平 有人有什么想法吗 Go to 文件 gt 设置 gt 构建 执行 部署 gt 编译器 gt Java 编译器如果在 Mac 上 则位于
  • 如何从 DOM 中删除某个类的所有元素?

    var paras document getElementsByClassName hi for var i 0 i lt paras length i paras i style color ff0011 hi remove p clas
  • 尝试访问 CIFilter 的 outputImage 时出现“无法识别的选择器”

    我第一次尝试 Core Image 在 OS X 10 7 3 上 但遇到了困难 我确信我正在做的事情很愚蠢 只需要更熟悉该框架的人向我指出 考虑以下代码 让我们规定imageURL是指向磁盘上 JPG 的有效文件 URL CIImage
  • 如何在 Swift 中获取小数位数并加一?

    我需要在最后一个小数位实现加函数 例如 print plusOne 0 0001 gt 0 0002 print plusOne 0 000001 gt 0 000002 print plusOne 22 gt 23 有人做过这件事吗 您可
  • Struts2 jQuery struts-plugin.xml 无效

    我已经设置了一个由 Struts2 Springs JPA 组合而成的项目 我最近遇到了Struts2 Jquery 插件 在我的项目中使用这个插件 struts2 jquery plugin 3 5 1 jar 时出现错误 Unable
  • 如何获取连接到 Android 设备的 USB 配件列表?

    我有一个基于棒棒糖的安卓盒子 该盒子有一个 USB 端口 类似于 Android 手机中的微型 USB 端口 我想检查是否有任何主机连接到 USB 端口 并且 Android 盒子处于设备模式 类似于手机连接到 PC 时的情况 至少 我只需
  • 哪些类型的控件不会显示在 Spy++/Inspect 中?

    我们正在开发一个 Windows 桌面应用程序 该应用程序可以从其他应用程序上的其他控件中提取值 我们的产品非常适合大多数桌面应用程序 我注意到某些控件没有显示在检查和 Spy 中 例如 在 GP 2015 客户端中 只有少数控件可在 Sp
  • 计算平均字长和平均句子长度的 Java 代码

    好吧 我是一个相对较新的程序员 在这项任务上我遇到了很大的困难 作业是创建一个 2 类 java 代码 该代码将读取一个文件 具体是一本书 并对其进行分析以计算平均句子长度和平均单词长度 正确的输出应该是这样的 gt java WordMa
  • python相同unicode的不同长度

    我发现关于 unicode 的一些事情很奇怪 根据我的理解 如果我 u string 类型将是 unicode 但为什么它们的长度不同 print len u New York u200b 14 print type u New York
  • hdfs 权限被拒绝

    我是hadoop分布式文件系统的新手 我已经在我的机器上完成了hadoop单节点的完整安装 但是之后当我将数据上传到hdfs时 它给出了错误消息Permission Denied 来自终端的消息 包含命令 hduser ubuntu usr
  • 为什么我们在c++中需要接口或纯虚函数

    为什么我们在c 中需要接口 纯虚函数或抽象类 我们可以不使用抽象类 而使用一个基类并在其中定义虚函数 并在派生类中重写该虚函数吗 上述方法有什么优点和缺点 除了我们可以创建基类的对象 纯虚函数适用于没有合理的方法在基类中实现该函数的情况 例
  • 如何重新排序整数的字节? [复制]

    这个问题在这里已经有答案了 我的任务是使用 C 将数据文件从大端转换为小端 反之亦然 我已经在网上查找了大约 3 个小时的其他示例并阅读了我的教科书 但是我对如何开始这个问题非常困惑功能 到目前为止 我的事件顺序是正确的 1 到 4 但在我
  • 适用于所有 iOS (iPhone/iPad/Apple Watch) 设备的 App Store Connect 屏幕截图尺寸

    我正在尝试向 App Store 提交新的应用程序 但现在 Apple 要求提供 4 7 英寸和 5 5 英寸 iPhone 的屏幕截图 有人有这些截图规格 尺寸 吗 我尝试过 640 x 1136 纵向 640 x 1096 纵向 113
  • 如何解决问题:int无法解引用

    这里我有一些值 其中两个是整数 并且我无法对它们调用方法 因为它们不是引用 我该如何解决这个问题 String srcAddr dstAddr protocol int srcPort dstPort public int hashCode