当前位置: 首页 > 知识库问答 >
问题:

使用整数的模糊方法调用

连昊天
2023-03-14

我正在用Android编写一些Junit测试,如果我这样做:

public void testSetId(){
    Friend friend = new Friend(5);
    assertEquals(5,friend.getId());
}

我得到一个不明确的方法调用错误。

方法调用不明确:AssertEquals(int,int)和AssertEquals(Object,Object)都匹配

然而,如果我这样做:

public void testSetId(){
    Integer ID = 5;
    Friend friend = new Friend(ID);
    assertEquals(ID, friend.getId());
}

它起作用了。我觉得第二个函数应该做完全相同的事情。

这是怎么回事?

共有1个答案

宗政金鹏
2023-03-14

在Java5之前,没有自动装箱或自动拆箱。这意味着如果方法foo的参数类型为整数,则以下内容不会编译

foo(5);    // 5 needs to be autoboxed

同样,如果方法bar的参数类型为int,则不会编译

bar(new Integer(5));    // The Integer needs to be unboxed

当引入自动装箱和自动拆箱时,现有代码必须继续以与以前完全相同的方式工作。因此,当编译器决定调用哪个方法时,它首先只考虑不需要自动装箱或自动拆箱的适用方法。只有当没有这样的方法时,编译器才考虑需要自动装箱和/或自动拆箱的方法。

由于getId返回一个整数,因此在第一个参数也是整数的情况下,可以在不自动装箱的情况下调用ObjectObject方法。但是,intint方法只能通过自动取消装箱第二个参数来调用。因此,在您的第二个示例中,在第一遍选择了ObjectObject重载。

在第一个示例中,您试图传递int和Integer。intint方法仅通过自动取消装箱第二个参数适用,而ObjectObject方法仅通过自动装箱第一个参数适用。因此,无法在第一次传递时选择重载,并且由于两种方法都不比另一种方法更具体(您需要查找最后一位),编译器无法在这两种方法之间进行选择。

重载解析极其复杂,实际上我已经将其简化了很多(也有涉及var args的规则)。然而,在实践中,您不需要学习所有这些规则-如果您需要告诉编译器要应用哪种方法,您可以始终包含一个或多个显式强制转换:

assertEquals((Integer) id, friend.getId());

 类似资料:
  • 问题内容: 我对Java的 varargs 方法有些困惑: 当我尝试在不传递任何参数的情况下进行调用时,将调用方法的版本。我不明白为什么;通常,编译器必须引发错误。 相比之下,当我尝试不带任何参数的情况下,以下代码会生成编译器错误: 问题答案: 这里适用的一般规则是:如果一个方法签名严格比另一个方法签名 更具体 ,则Java选择它时不会出错。 从直觉上讲,如果您可以完全删除一个方法签名,则该方法签

  • 问题内容: 这是一个无法编译的代码示例: 有人可以告诉我这些方法模棱两可的原因吗?先感谢您。 问题答案: 考虑方法签名 和 在装箱和拆箱之前,通话不会是模棱两可的。为了确保与Java的早期版本兼容,该调用将保持明确。因此,重载解决方案的第一阶段不允许装箱,拆箱或可变Arity调用,这些操作都是在同一时间引入的。可变Arity调用是通过为最后一个参数(而不是数组)传递参数序列来调用varargs方法

  • 我正在使用Eclipse集成的ProGuard来混淆我的应用程序APK。 我已尝试为应用程序导出签名包。APK已安装,但无法正常工作(有无Proguard混淆) 但是,eclipse生成了一个带调试符号的APK,它工作得非常好。有什么办法可以混淆那个APK吗? 我需要得到一个正常工作的签名,混淆的APK不是为了发布,但内部共享。

  • 我的目标是优化我的应用程序代码。我的代码如下所示: 当我在Netbeans中使用Findbugs进行静态分析时,它显示了一个类似于“方法调用无效的新整数(int)构造函数;使用Integer.valueOf(int)”的警告/错误。 我知道新整数(int)和整数之间的区别。valueOf(int)。 一个创建一个附加对象,另一个不创建。一个不缓存,另一个缓存。 所以我这样修改了我的代码... 但同

  • 模糊可以柔化整个或部分图像中的细节。 左侧的原始图像未经过模糊处理。而对于右侧的图像来说,飞机后面的区域经过了模糊处理。

  • 问题内容: 我想知道是否有某种方法可以使用jQuery(或jQuery可以修改的CSS)在div上应用高斯模糊。我已经研究了blur(),但至少使用Safari,它似乎并没有达到我想要的功能。如果可能的话,我想在效果上使用fadeIn,因此它会逐渐模糊。 谢谢你的帮助! 问题答案: 请注意,这是当DOM元素(例如文本框(输入等))失去焦点时,不应与您所谈论的那种模糊(高斯/运动模糊)混合在一起的时