OCA Java SE 7 Programmer I Certification Guideという本を読んで、Java SE 7 Programmer I 試験 ( 1Z0-803 ) の準備をしています。この本には、著者が Java プログラミングで 12 年の経験を持ち、技術的な校正者 (おそらく給料で) がいるにも関わらず、多数の欠陥があります。
しかし、それが私を不安にさせることが1つあります。著者は 168 ページで、この声明は真実であると述べています。
メソッドの戻り値の型が の場合、メソッドは
int
型の値を返すことができますbyte
。
ええと、私は別の主張をしており、あなたの助けが必要です。例として、次のコードを取り上げます。
public static void main(String[] args)
{
// This line won't compile ("possible loss of precision"):
byte line1 = returnByte();
// compiles:
int line2 = returnByte();
// compiles too, we "accept" the risk of precision loss:
byte line3 = (byte) returnByte();
}
public static int returnByte()
{
byte b = 1;
return b;
}
明らかに、コンパイラは、returnByte()
メソッド シグネチャの異なる戻り値の型 int と、メソッドの実装の最後に実際に返されるもの (バイト) について文句を言いません。バイトは int (32) よりも少ないビット (8) を使用し、精度が失われるリスクなしに int にキャストされます。しかし、戻り値は常に整数です! それとも私が間違っていますか?試験で何と答えたでしょう?
本のこのステートメントは正しいと言われているため、実際の戻り値の型が何であるかは完全にはわかりません。メソッドの実装の最後にキャストが発生していますか、それとも代入の直前にメイン メソッドでキャストが発生していますか?
現実の世界では、暗黙のキャストと精度を失うリスクを理解している限り、この質問は問題になりません。しかし、これは試験で出題される可能性のある問題の 1 つに過ぎないので、この問題に対する技術的に正しい答えを知りたいです。
明確化!
byte
回答の大部分は、 aを anint
にキャストできるかどうか、その場合に何が起こるかを知りたいと考えているようです。まあ、それは問題ではありません。返された型が何であるかを尋ねています。言い換えれば、著者の引用文は正しいですか、それとも間違っていますか? int へのキャストは、returnByte() メソッドが実際に戻る前または後に発生しますか? これが実際の試験で、この問題を受け取ったとしたら、何と答えたでしょうか?
コード スニペットの line1 を参照してください。著者の言うことが正しければ、戻り値がバイトになるため、その行はコンパイルされます。しかし、それはコンパイルされません。型昇格の規則によれば、int を 1 バイトに圧縮しようとすると、精度が失われる危険性があります。私にとって、それは戻り値が整数であることの証明です。