java 11 練習問題 ~ローカル変数型推論編~
java 11 練習問題 ~ローカル変数型推論編~
動作環境と問題内容について
javaの練習問題です。 出題範囲はjava 9 以降に追加された範囲を中心とします。このシリーズでは、ローカル変数型推論に関する問題を出題します。
難易度は Java SE 11 Programmer I の試験と同程度※を想定しています。
※ただし、場合によっては同試験には出題されない内容や形式が含まれることもあります。あくまでも難易度の目安として解答してください。
実行環境は以下の通りです。
javaのバージョン
javac 11
openjdk version “11” 2018-09-25
OpenJDK Runtime Environment 18.9 (build 11+28)
OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)
※問題文に書いてあるプログラムを実行する際は自己責任で実行してください。
問題
次のプログラムを作成した。コンパイル、実行に関して以下の問いに答えなさい。
プログラム(Sample.java)
public class Sample{ public static void main(String[] args){ /* A */ } }
問.以下の a ~ d のコードのうち、Aの部分に入れた場合にコンパイルエラーになるコードはどれか。すべて選べ。いずれもコンパイルエラーにならない場合は e を選択せよ。
選択肢
a. var v = new Runnable();
b. var v = new Runnable(){ };
c. var v = new Runnable(){
@Override
public void run(){ }
};
d. var v = new Runnable(){
void run(){
System.out.println(“Hello”);
}
};
e. a ~ d のいずれもコンパイル可能
(解答はこちら)
解答
a. var v = new Runnable();
と
b. var v = new Runnable(){ };
と
d. var v = new Runnable(){
void run(){
System.out.println(“Hello”);
}
};
解説
java でローカル変数型推論を利用する場合、変数宣言時に代入された値からデータ型が推測される。
代入時の右辺は匿名クラスでも問題ない。今回の問題のポイントは、『インタフェースの実装方法として正しいかどうか』『匿名クラスとして正しく実装されているかどうか』である。
a. var v = new Runnable();
選択肢 a は Runnableインタフェースを new キーワードを利用してインスタンス化しようとしている。これは java の文法上正しくない。
よってコンパイルエラー。
b. var v = new Runnable(){ };
選択肢 b は Runnableインタフェースを匿名クラスでを実装している。インタフェースを匿名クラスで実装する場合、 すべての抽象メソッドをオーバーライドして実装する必要がある 。
選択肢 b では、Runnableインタフェースの抽象メソッドである run()メソッドを実装していない。
よってコンパイルエラー。
d. var v = new Runnable(){ (中略) };
選択肢 d では、Runnableインタフェースを匿名クラスで実装している。抽象メソッドである run()メソッドもオーバーライドされているように見える。
しかし、javaのオーバーライドのルールでは、 オーバーライドされるメソッドの可視性を下げてはいけない (上げることは可能)。また、 インタフェースの抽象メソッドは暗黙的に可視性が public となる。
選択肢 d では、rum()メソッドの可視性は default(アクセス修飾子なし) になっている。これは、可視性を下げる方向の変更になる。
よってコンパイルエラー。
var の使い方について、詳しくはこちらの記事を参照
まとめ
java 10 からは、ローカル変数型推論を用いた変数宣言ができるようになった。
正確に理解した上で、設計や実装時にはソースコードの保守性が下がらないように注意して利用する必要がある。
<<前回の問題はこちら | 第1問はこちら | 次の問題はこちら>>>
オススメ!!→ java 11 の問題はこちら オススメ!!→ java 8 の問題はこちら オススメ!!→ javaのプログラム作成練習問題はこちら オススメ!!→ ローカル変数型推論の使い方と注意点