当前位置: 首页 > 面试题库 >

缩小在Java中的方法调用中如何工作?

冀弘厚
2023-03-14
问题内容

为什么这会导致编译时错误?2在编译时是常量,因此由于2在字节范围内,因此此处应允许缩小。

public class Test {


 public static void main(String[] args) {

    ForTest test=new ForTest();
    test.sum(1, 2); //compile time error here

}

}
class ForTest
{

public int sum(int a,byte b)
{
    System.out.println("method byte");
    return a+b;
}
}

错误是:ForTest类型的方法sum(int,byte)不适用于争论(int,int)。

编辑:我认为答案就在这里:http
:
//docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.3但我没有得到:(


问题答案:

您必须区分 赋值转换方法调用转换

缩小原始转换

首先,请看JLS§5.1.3:

关于原始类型的22种特定转换称为“ 缩小原始转换”

  • […]

  • 从int到byte,short或char

[…]

请注意,这仅说明了机制,但没有说明允许或不允许进行此类转换的地方。

作业转换

接下来,查看JLS§5.2:

[…]

另外,如果该表达式是字节,short,char或int类型的常量表达式(第15.28节):

  • 如果变量的类型为byte,short或char,并且常量表达式的值可表示为变量的类型,则可以使用缩窄的原始转换。

[…]

这清楚地说明了在赋值中允许byte b = 2int 类型到 byte 类型的变窄转换。

方法调用转换

但是,在阅读JLS§5.3时,您不会读到任何有关缩小转换的内容。因此,编译器正在做正确的工作。



 类似资料:
  • 这是一个使用合并排序的程序,从1到1000对1000个数字的列表进行排序。它显示原始列表,然后调用递归方法对其进行排序,然后显示。 代码中我不明白的是这两行: 合并排序(数字,低,中);//在方法中,它会说“这里” 合并排序(数字,中间1,高); 我是java的初学者,这与我所学的一切背道而驰,因为我无法理解如何在方法中调用方法。除非它是一个我怀疑的对象。有人能解释一下这两行代码的作用吗?

  • 问题内容: 我有用户将在命令行/终端Java程序上输入的命令列表(i,h,t等)。我想存储命令/方法对的哈希: 这样我就可以得到类似以下的代码: 这可能吗?如果没有,那么简单的方法是什么? 问题答案: 使用Java 8+和Lambda表达式 使用lambda(可在Java 8+中使用)进行以下操作: 在这种情况下,我很懒惰并重用了该接口,但是也可以使用我在答案的Java 7版本中发明的-。 此外,

  • 问题内容: 在我遵循的方法: 我可以从HTML调用它,例如: 如您所见,如果我得到回报 这是实用程序,因此我想将其定义为 没有例外 当我尝试这样称呼它时: 没发生什么事。 **我已添加到控制器。 如何从HTML调用工厂方法? (*如果不清楚,欢迎您更改/编辑我的问题) 谢谢, 问题答案: 好吧,您实际上不应该这样做…但是您 可以 做的是将服务对象放在$ scope的一个属性中,然后从那里调用它。

  • 问题内容: 考虑下面的两个简单的Java类: 第一个例子 第二个例子 程序运行后,如何跟踪(1)哪个对象调用哪个方法(2)以及执行多少次? 稍微精确一点,我可能有100个类和1000个对象,每个对象都调用100多个方法。我希望能够跟踪(在运行程序之后)哪个对象调用了哪种方法以及调用了多少次。 感谢您的任何建议。 问题答案: 这将为所有线程中所有对象的每个方法调用打印一行: 和 您可以使用 hous

  • 问题内容: 因此,我正在编写一个使用大型c 库的Android应用。我可以正常工作,以便Java应用程序可以调用c 委托方法,但是我发现自己希望自己可以将来自c 的消息记录到Android日志中。从Java上这很容易,但是我不知道如何从c 调用Java方法。我的搜索找到了从c 打开jvm的方法,这根本不是我想要做的。理想情况下,我想将日志方法指针传递给c ,然后可以在需要时使用它。当然,Java不

  • 问题内容: 我想在自己的类中调用抽象类的方法。抽象类是: 我想调用上面的方法,并且调用的类是: 每当我尝试运行上述类时,它都会在line上引发NullPointerException 。谁能告诉我如何解决这个问题? 问题答案: 首先,一个抽象类,因此您不能直接实例化它。您必须创建一个子类,比如说它覆盖Call中的任何抽象方法。 获得一个意味着您作为参数传入的任何内容都尚未初始化。因此,在创建Cal