将 int 文字传递给在 java 中采用整数的方法

Posted

技术标签:

【中文标题】将 int 文字传递给在 java 中采用整数的方法【英文标题】:passing int literal to method that takes integer in java 【发布时间】:2016-05-18 07:20:24 【问题描述】:

这可能是堆栈溢出中最愚蠢的问题,但这让我很困扰......

 public class shorte

    public static void main(String []args)
    
        short e = 56; // no need for explicit cast
        System.out.println(e);
        start(56);  // why does int literal here needs explicit cast ...
    
    static void start(short e)
    
        System.out.println(e);
    

虽然从函数中的 int 文字创建普通的短变量并没有要求任何显式转换,但是 为什么将 int 文字传递给短变量(参数传递)需要显式转换......??

再一次

我现在不建议在一个帖子中问两个不相关的问题,但这太微不足道了,不能在另一个帖子中问..

**“for”计数器变量的范围**

    public class forloop

    public static void main(String []args)
    
        int a =12;
        for(int a =12;a<14;++a) // no showdowing of variable ,give compile-time error
        
            System.out.println(a);
        
    

所以我用普通方块试了一下

   a=12

a=13; even this doesn't compile 

这是否意味着,块没有自己的范围...

【问题讨论】:

他们有自己的范围,但这并不意味着他们会忽略之前定义的所有内容。只需在循环之前定义a,然后重新定义一个具有相同名称的变量,这将导致编译时错误。 没有人可以同时回答两个答案。请将您的问题分开,否则它们将被关闭。 docs.oracle.com/javase/tutorial/java/nutsandbolts/… 查找整数文字。 (1) 对于使用更宽的常量进行初始化,java 不那么严格。作为一个参数,它被认为太不清楚了,就像方法重载一样,可能有两个方法同名,相当随意的推理。 (2) 感觉在一个方法中重新声明同名是不可读、容易出错且缺乏想象力的糟糕风格,并且可能是疏忽(重用旧名称),因此他们将其作为错误。 不应该编译器至少尝试在声明的方法之间进行匹配以找到最好的方法....在这种情况下是 start(short e)...@JoopEggen 【参考方案1】:

short 文字可以从 Java 中的 int 文字自动构造。这是

的情况
short e=50;

但是调用函数和传递参数是不同的。由于重载的可能性,函数调用应该与函数原型完全匹配。想象一个重载函数,其中一个版本带有 int 参数,另一个版本带有 short 参数。

至于第二个问题,在大多数语言中,您通常不能隐藏在内部范围内由相同标识符声明的外部范围内的标识符。我脑子里有两个例外:

1- 全局变量可以被局部变量隐藏(例如在 C++ 中,因为 Java 没有全局变量)。

2- 类数据成员可以被局部变量隐藏。

在这两种情况下,该语言都提供了解析运算符(:: 表示 1- 和 this 表示 2- )。

【讨论】:

是的!!!,这是有道理的,要使阴影相关,必须提供一个分辨率运算符来在阴影和阴影变量之间进行选择......优雅的解释为什么阴影不能进入在这里玩@Wabbi @viru 很高兴很清楚。有没有人有其他可能的类似阴影的例子? 但就第一个问题而言,编译器不应该至少尝试在声明的方法之间进行匹配以找到最好的方法......在这种情况下是 start(short e).. ..@Wabbi 编译器不会这样做,因为可能有另一个重载版本的start 接受int 参数。在您的示例中不是这种情况,但编译器只是不这样做以避免可能的逻辑错误。 @病毒 类父 int x=90; class child extends parent//super.x get shadowed int x =78; public static void main(String []args) child c=new child(); System.out.println(c.x); c.start(); void start() System.out.println(super.x); @Wabbi【参考方案2】:

仅从技术角度来看(不推测原因;-)):在the specification

一)

5.2 赋值转换 [...]另外,如果表达式是常量表达式 ( §15.28 ) 类型 字节 , 短的 , 字符 , 或者 整数 : • 如果变量的类型为 字节 , 短的 , 或者 字符 ,并且常量表达式的值可以表示为 变量的类型。

b)

6.4 阴影和遮蔽 [...]如果局部变量的名称是编译时错误 v 被重新声明为本地 直接封闭的方法、构造函数或初始化块的变量 范围 v ;或作为 a 的异常参数 抓住 a中的子句 尝试 陈述 范围内直接封闭的方法、构造函数或初始化程序块的 的 v ;或作为资源 尝试 -with-resources 的直接封闭语句 范围内的方法、构造函数或初始化程序块 v .

【讨论】:

【参考方案3】:

问题 2:

int a =12;
        for(int a =12;a<14;++a) // no showdowing of variable ,give compile-time error
        
            System.out.println(a);
        

我认为原因是大多数时候,这不是故意的,而是编程或逻辑缺陷。

在像您这样微不足道的示例中,这是显而易见的,但在一大段代码中,意外地重新声明变量可能并不明显。

问题一:

在int版本中,编译器知道数字中的所有数据都可以用short形式存储。没有信息丢失。对于文字值而言,情况并非总是如此。

【讨论】:

以上是关于将 int 文字传递给在 java 中采用整数的方法的主要内容,如果未能解决你的问题,请参考以下文章

将变量传递给在 TabBar 中调用的视图

将字符分配给在 C 中使用 malloc 声明的二维数组时收到警告

可以将 Java 数组传递给采用数组的 C/C++ 函数吗?

如何使用事件将 json 输入传递给在无服务器中部署的 Cron 计划 Lambda?

Clojure - 将组件传递给在启动或停止期间未执行的功能

将 Ansible 变量从一个角色(在一个主机上运行)传递给在同一剧本中的另一台主机上运行的另一个角色