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

passing int literal to method that takes integer in java

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

 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 文字创建普通的 short 变量时没有要求任何显式转换,但是 为什么将 int 文字传递给 short 变量(参数传递)需要显式转换......??

再一次

我现在不建议在一个 post 中提出两个不相关的问题,但这太微不足道了,无法在另一个 post..

中提出

** '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 
}

这是否意味着块没有自己的作用域...

问题 2:

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

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

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

问题 1:

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

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

的情况
short e=50;

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

关于第二个问题,在大多数语言中,您通常无法隐藏在外部作用域中声明的标识符由内部作用域中的相同标识符声明。我脑子里有两个例外:

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

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

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

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

一)

5.2 Assignment Conversion
[...]
In addition, if the expression is a constant expression ( §15.28 ) of type byte , short , char , or int :
• A narrowing primitive conversion may be used if the type of the variable is byte , short , or char , and the value of the constant expression is representable in the type of the variable.

b)

6.4 Shadowing and Obscuring
[...]
It is a compile-time error if the name of a local variable v is redeclared as a local variable of the directly enclosing method, constructor, or initializer block within the scope of v ; or as an exception parameter of a catch clause in a try statement of the directly enclosing method, constructor or initializer block within the scope of v ; or as a resource in a try -with-resources statement of the directly enclosing method, constructor or initializer block within the scope of v .