Java:に次のコードがあります。
class Boxing
{
public static void main(String args[])
{
short s = 10;
Integer iRef = s;
}
}
コンパイル時にエラーが発生するのはなぜですか?式でshortを整数に明示的にタイプキャストすると、正常にコンパイルされます。式でshortを使用しているので、その型は、明示的な大文字と小文字を区別せずに、デフォルトで整数であると想定されていませんか?
ここでは、拡大と自動ボクシングという2つのことを実行したいと考えています。
残念ながら、Javaは2つのうち1つだけを自動的に実行します。その理由は、オートボクシングがかなり遅れて(Java5で)導入された可能性が高く、既存のコードを壊さないように注意する必要がありました。
できるよ
int is = s; // widening
Short sRef = s; // autoboxing
Integer iRef = (int) s; // explicit widening, then autoboxing
ボクシング変換は、プリミティブ型の式を参照型の対応する式に変換します。具体的には、次の9つの変換はボクシング変換と呼ばれます。
ブール型からブール型へ
タイプバイトからタイプバイトへ
ショートタイプからショートタイプへ
Char型からCharacter型へ
Int型からInteger型へ
ロングタイプからロングタイプへ
フロート型からフロート型へ
タイプdoubleからタイプDoubleへ
ヌルタイプからヌルタイプへ
これが JLS 5.1.7 からのドキュメントです
ボクシング変換は、プリミティブ型の式を参照型の対応する式に変換します。具体的には、次の9つの変換はボクシング変換と呼ばれます。
ブール型からブール型へ
タイプバイトからタイプバイトへ
ショートタイプからショートタイプへ
Char型からCharacter型へ
Int型からInteger型へ
ロングタイプからロングタイプへ
フロート型からフロート型へ
タイプdoubleからタイプDoubleへ
ヌルタイプからヌルタイプへ
基本的に、short
からInteger
への直接変換は、Java
の自動ボクシングプロセスの一部ではありません。
上記のオートボクシングでは、表現するプリミティブ型を、表現するWrapperクラスに暗黙的にキャストすることしかできません。これは当てはまらないため、コンパイル時エラーが発生します。
Javaは、自動拡張、自動ボクシング、自動アップキャストの順に実行しようとしますが、同じ割り当てに対してこれらのうち2つは実行しません。これは、メソッドパラメータ割り当ての関連するケースについて説明および図解されています ここ 。
考慮されるコードで。
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;
}
}
エラーなしで実行されます。