web-dev-qa-db-ja.com

整数参照に短い変数を割り当てると、コンパイル時エラーが発生するのはなぜですか?

Java:に次のコードがあります。

class Boxing
    {
        public static void main(String args[])
        {
            short s = 10;
            Integer iRef = s;
        }
    }

コンパイル時にエラーが発生するのはなぜですか?式でshortを整数に明示的にタイプキャストすると、正常にコンパイルされます。式でshortを使用しているので、その型は、明示的な大文字と小文字を区別せずに、デフォルトで整数であると想定されていませんか?

9
kauray

ここでは、拡大と自動ボクシングという2つのことを実行したいと考えています。

残念ながら、Javaは2つのうち1つだけを自動的に実行します。その理由は、オートボクシングがかなり遅れて(Java5で)導入された可能性が高く、既存のコードを壊さないように注意する必要がありました。

できるよ

int is = s;    // widening

Short sRef = s;   // autoboxing

Integer iRef = (int) s;  // explicit widening, then autoboxing
14
Thilo

ボクシング変換は、プリミティブ型の式を参照型の対応する式に変換します。具体的には、次の9つの変換はボクシング変換と呼ばれます。

ブール型からブール型へ

タイプバイトからタイプバイトへ

ショートタイプからショートタイプへ

Char型からCharacter型へ

Int型からInteger型へ

ロングタイプからロングタイプへ

フロート型からフロート型へ

タイプdoubleからタイプDoubleへ

ヌルタイプからヌルタイプへ

参照: コンバージョンとプロモーションの参照

1
rupesh_padhye

これが JLS 5.1.7 からのドキュメントです

ボクシング変換は、プリミティブ型の式を参照型の対応する式に変換します。具体的には、次の9つの変換はボクシング変換と呼ばれます。

ブール型からブール型へ

タイプバイトからタイプバイトへ

ショートタイプからショートタイプへ

Char型からCharacter型へ

Int型からInteger型へ

ロングタイプからロングタイプへ

フロート型からフロート型へ

タイプdoubleからタイプDoubleへ

ヌルタイプからヌルタイプへ

基本的に、shortからIntegerへの直接変換は、Javaの自動ボクシングプロセスの一部ではありません。

上記のオートボクシングでは、表現するプリミティブ型を、表現するWrapperクラスに暗黙的にキャストすることしかできません。これは当てはまらないため、コンパイル時エラーが発生します。

1
SomeJavaGuy

Javaは、自動拡張、自動ボクシング、自動アップキャストの順に実行しようとしますが、同じ割り当てに対してこれらのうち2つは実行しません。これは、メソッドパラメータ割り当ての関連するケースについて説明および図解されています ここ

0
Luke Hutchison

考慮されるコードで。

class Boxing
{
    public static void main(String args[])
    {
        short s = 10;
        Integer iRef = s;
    }
}

整数はJava.lang.Numberを拡張します。また、Java.lang.ShortはJava.lang.Numberも拡張します。ただし、次のプログラムを実行したい場合は、ShortとIntegerは直接関係していません。

class Boxing
{
    public static void main(String args[])
    {
        short s = 10;
        Number iRef = s;
    }
}

エラーなしで実行されます。

0
Rahul Vatsa