`
ZangXT
  • 浏览: 118049 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java方法调用时的类型转换

阅读更多

      Java进行方法调用时,可能会对参数的类型进行转换,以匹配到要调用的准确方法,在重载时要尤其注意这个问题。java语言规范中有相关的规定。

Method invocation conversion is applied to each argument value in a method or constructor invocation (§8.8.7.1, §15.9, §15.12): the type of the argument expression must be converted to the type of the corresponding parameter. Method invocation contexts allow the use of one of the following:

  • an identity conversion (§5.1.1)

  • a widening primitive conversion (§5.1.2)

  • a widening reference conversion (§5.1.5)

  • a boxing conversion (§5.1.7) optionally followed by widening reference conversion

  • an unboxing conversion (§5.1.8) optionally followed by a widening primitive conversion.

大体翻译一下: 方法调用转换适用于方法和构造方法的调用:参数表达式的类型必须转换为相应的参数的类型。(感觉这里argument是我们常提到的实际参数的意义,而parameter是方法中的形式参数的意思,英文容易区分,不过翻译过来怪怪的。)方法调用上下文允许使用以下类型转化:

1.同一转换。这里可以直接理解为就是同一类型的匹配。

2.拓宽基本类型转换。

3.拓宽引用类型转换。

4.装箱转换,后面可以随意地加上拓宽引用类型转换。

5.拆箱转换,后面可以随意地加上拓宽基本类型转换。

Method invocation conversions specifically do not include the implicit narrowing of integer constants which is part of assignment conversion (§5.2). The designers of the Java programming language felt that including these implicit narrowing conversions would add additional complexity to the overloaded method matching resolution process (§15.12.2).

再需要注意到就是方法调用约定不包括整数常量的处理,例如

public static voif test(short s){

}

test(12);是不能匹配上面定义的方法的。

例子:

 

  1. publicclassTest{
  2. publicstaticvoidmain(String[]args){
  3. shorts=5;
  4. test(s);
  5. }
  6. publicstaticvoidtest(shorts){
  7. System.out.println("short");
  8. }
  9. publicstaticvoidtest(inti){
  10. System.out.println("int");
  11. }
  12. publicstaticvoidtest(floatf){
  13. System.out.println("float");
  14. }
  15. publicstaticvoidtest(Integeri){
  16. System.out.println("Integer");
  17. }
  18. publicstaticvoidtest(Numbern){
  19. System.out.println("Number");
  20. }
  21. publicstaticvoidtest(Shorts){
  22. System.out.println("Short");
  23. }
  24. }

 

使用test(s);首先选择的是test(short s)这个方法,使用的是 1.同一转换。

然后删除test(short s)方法,测试,这时会调用test(int i)这个方法,使用的是 2.拓宽基本类型转换。

删除test(int i)方法,测试,这时会调用test(float f)方法,使用的仍然是 2.拓宽基本类型转换。

删除test(float f)方法,测试,这时会调用test(Short s)方法,这时使用的是4.装箱转换。对short 变量s,装箱处理为Short,匹配test(Short s)方法。

删除test(Short s)方法,测试,这时会调用test(Number n)方法(特别注意,不是调用test(Integer i)方法)。这里使用的转换是4.装箱转换,后面可以随意地加上拓宽引用类型转换。首先short s被装箱得到Short类型变量,然后使用拓宽引用类型转换,得到Number类型。

最后我们删除test(Number n)方法,编译错误。也就是说short s不会先拓宽为int类型,再进行装箱处理。这点要注意。

分享到:
评论

相关推荐

    基于JavaParser的代码调用链分析,可以用于分析Java代码的方法调用链.zip

    这个压缩包中的内容可能包含了一系列使用JavaParser进行代码分析的示例或工具,特别是关于方法调用链的分析。这种方法调用链分析在软件工程中具有重要的应用价值,比如代码审查、性能优化、依赖关系理解以及重构等。...

    java调用kettle中的job与转换-源码

    Java调用Kettle中的Job与转换是数据集成过程中的常见需求,Kettle(Pentaho Data Integration,简称PDI)是一种强大的ETL工具,而Java则作为通用编程语言,能够灵活地与各种系统进行交互。在Java中调用Kettle的Job和...

    java调用视频转换工具ffmpeg.zip

    在实际应用中,Java调用FFmpeg进行视频转换时,需要注意以下几点: 1. 文件权限:确保Java程序有读取输入文件和写入输出文件的权限。 2. 并行处理:为了提高转换速度,可以考虑多线程并行处理多个视频文件。 3. 错误...

    Java调用kettle转换

    ### Java调用Kettle转换详解 #### 一、引言 在数据处理领域,Pentaho Data Integration(PDI),通常被称为Kettle,是一款非常强大的开源ETL工具,用于完成数据抽取、转换与加载(Extract, Transform, Load)任务...

    Java 多态中的类型转换

    - **多态方法调用**:在多态环境中,父类引用调用方法时,实际执行的是子类重写(Override)过的方法,这就是动态绑定或晚期绑定。 - **抽象类与接口**:除了普通类之间的转换,抽象类和接口也可以参与多态转换。...

    groovy和Java相互调用1

    Java调用Groovy类则稍微复杂一些,通常有两种主要方法: 1. **方法1:直接调用** - 如果你的开发环境(如IntelliJ IDEA或Eclipse)已经安装了Groovy解释器插件,那么可以直接在Java代码中像调用Java类一样调用...

    C#调用JAVA方法

    4. **调用Java方法**:使用`JNIEnv.CallObjectMethod`、`JNIEnv.CallVoidMethod`等方法,根据返回值类型和参数类型选择合适的方法。 5. **处理结果**:将Java对象的结果转换回.NET对象,以便在C#中进一步处理。 **...

    用java程序调用ffmpeg执行视频文件格式转换flv

    总结来说,通过Java调用FFmpeg和Mencoder进行视频格式转换,需要理解这两个工具的命令行语法,以及如何在Java中执行外部进程。此过程涉及到文件类型的检查、预处理转换(如果必要)、最终的格式转换以及错误处理,...

    Java反射调用方法

    Java反射是Java语言提供的一种强大的动态类型特性,它允许程序在运行时检查和操作类、接口、对象等的内部信息,包括但不限于获取类的方法、字段、构造器等,并能动态调用方法和修改字段值。这个特性使得Java具有了更...

    XSLT 调用 Java 的类方法

    - **参数类型**:确保传递给Java方法的参数类型与方法声明的一致。 - **访问权限**:Java方法必须是公共的(public),并且最好是静态的(static)。 - **调用组件**:通常通过`TransformerFactory`来实现调用。 - **非...

    java调用C#封装的dll方法

    ### Java调用C#封装的DLL方法 #### 第一种方法:Java利用JNA进行调用 **背景介绍:** 为了实现Java与C#之间的交互,一种常用的方式是通过调用C#封装的DLL文件来完成特定功能。这种方法涉及到.NET Framework与Java...

    Java异步调用转同步方法实例详解

    Java异步调用转同步方法实例详解是指在Java中将异步调用转换为同步调用的技术,主要用于解决异步调用过程中的阻塞问题。异步调用是一种非阻塞的调用方式,调用方在调用过程中,不直接等待返回结果,而是执行其他任务...

    Java方法调用.pdf

    例如,如果`max`方法的形式参数是`double`类型,而实际参数是`int`类型,那么在调用时需要将`int`转换为`double`。 总结起来,Java方法调用是程序执行逻辑的关键部分,理解如何正确调用静态、非静态和构造方法对于...

    Java RPC调用示例

    5. **调用处理**:当客户端发起请求时,服务器接收到请求后,根据请求中的信息找到对应的服务实现,执行服务方法,并将结果返回给客户端。 在"RpcTest"这个示例中,可能包含以下组件: - `ServiceInterface`:定义...

    Java调用Qt DLL

    Java调用Qt DLL是一个跨平台的技术实践,涉及到Java与C++之间的互操作性,其中Qt是一个流行的C++库,主要用于图形用户界面开发。这个主题主要包含以下几个知识点: 1. **JNI(Java Native Interface)**:JNI是Java...

    xslt中调用java

    在XSLT(可扩展样式表语言转换)中调用Java是一种常见的技术,它允许开发者利用XSLT处理XML文档时,与Java代码进行交互,从而实现更复杂的逻辑和功能。这种结合使得XSLT不仅可以进行简单的数据转换,还能执行更强大...

    Java方法调用实例.pdf

    本文将详细探讨Java方法调用的相关知识点,特别关注返回类型、变量赋值以及强制类型转换。 首先,方法的类型指的是方法返回的值的类型。在Java中,每个方法都必须有一个返回类型,除非它是一个void方法,这种情况下...

    java调用wps,实现word转pdf,word转图片等

    本话题主要关注如何利用Java调用WPS(金山办公软件)来实现Word到PDF的转换以及Word到图片的转换。这些功能对于处理大量文档和报告的企业尤其有用,可以自动化工作流程,减少手动操作。 首先,让我们了解WPS。WPS ...

    python调用java代码方法

    Python和Java的数据类型有所不同,因此在调用Java方法时需要进行类型转换。Jpype提供了一些内置的类型转换,如`jpype.JString`、`jpype.JInt`等。例如,如果`sayHello()`方法接受一个字符串参数: ```python name = ...

    ( java调用js__方法.docx

    Java 调用 JS 方法详解 Java 调用 JS 方法是指在 Java 代码中调用 JavaScript 代码的方法,从而实现 Java 和 JavaScript 之间...然而,在使用 Java 调用 JS 方法时,需要注意一些注意事项,以免出现错误或安全漏洞。

Global site tag (gtag.js) - Google Analytics