Java 8 練習問題 その4


java練習問題

java練習問題

動作環境と問題内容について

javaの練習問題です。 出題範囲はjava 8 で追加された範囲を中心とします。難易度は Java SE 8 Programmer I の試験と同程度※を想定しています。

※ただし、場合によっては同試験には出題されない内容や形式が含まれることもあります。あくまでも難易度の目安として解答してください。

実行環境は以下の通りです。

PC:MacBook Pro 2011early 15inch

OS:Windows 8.1(デュアルブート) 64bit版

メモリ:16GB(8GB x 2)

CPU:Core i7-2635QM 2.00GHz

javaのバージョン:java 8 Update102

 

※問題文に書いてあるプログラムを実行する際は自己責任で実行してください。

問題

次のプログラムを作成した。コンパイル、実行に関して以下の問いに答えなさい。

 

プログラム(Sample.java)

public class Sample{
  public static void main(String[] args){
    MyInterface obj = /*[A]*/
    }
}

interface MyInterface{
  boolean myMethod(Object val);
}

 

問./*[A]*/の部分に入れてコンパイルしてもコンパイルエラーにならないものを以下の選択肢からすべて選びなさい。

 

選択肢

/* a */
  (String val) -> {
    return true;
  };

/* b */
  (Object val) -> {
    return true;
  };

/* c */
  (Object val) -> return true;

/* d */
  (Object val) -> {
    true;
  };

/* e */
  (Object val) -> true;

/* f */
  String val -> {
    return true;
  };

/* g */
  Object val -> {
    return true;
  };

/* h */
  (val) -> {
    return true;
  };

/* i */
  val -> {
    return true;
  };

/* j */
  () -> {
    return true;
  };

/* k */
  val -> true;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

解答

 

b,e,h,i,k

 

 

解説

今回の選択肢は関数型インタフェース「MyInterface」を定義している。メソッド「myMethod」は、引数がObject型、戻り値がboolean型となっている。

interface MyInterface{
  boolean myMethod(Object val);
}

これをもとに、それぞれの選択肢を見ていく。

※解答解説の後に省略の可否の一覧でまとめてあるので、ラムダ式の省略について良く分からない場合はそちらを先にご覧ください。

 

選択肢 解答・解説
/* a */
(String val) -> {
  return true;
};
 ・引数のデータ型をObject型からString型に変更

× コンパイルエラー

myMethodメソッドの引数がもとと異なっており、ラムダ式の型推論と矛盾する。
ラムダ式の形は間違っていない。ひっかけ問題。

/* b */
(Object val) -> {
  return true;
};
・ 省略なし

○ コンパイル可能

ラムダ式を省略せずに実装した場合。特にエラーになる原因はない。

/* c */
(Object val)
   -> return true;

※スペースの都合で改行

・ { } のみ省略

× コンパイルエラー

{ }を省略する場合は必ずreturn キーワードも省略しなければならない。

/* d */
(Object val) -> {
  true;
}; 
 ・return キーワードのみ省略

× コンパイルエラー

return キーワードを省略する場合は必ず{ }も省略する。

/* e */
(Object val)
   -> true; 

※スペースの都合で改行

・ return と { }を同時に省略

○ コンパイル可能

処理がreturn文しかない場合は、returnのキーワードと{ }を同時に省略することができる。
cやdのようにどちらか一方のみを省略するとコンパイルエラーとなる。

※1 { } が省略できるのは処理が1行のみの場合だけなので要注意。
※2 戻り値はある。あくまで「return」というキーワードが省略されているだけなので要注意。

/* f */
String val -> {
  return true;
};
 ・引数のデータ型をObject型からString型に変更し、( )を省略

× コンパイルエラー

aと同じく、引数のデータ型をString型に変更すると型推論と矛盾が生じる。
これもひっかけ問題。( )の省略に関しては次の項目を参照。

/* g */
Object val -> {
  return true;
};
 ・( ) を省略

× コンパイルエラー

( )が省略できるのは引数が1つで、その引数のデータ型も同時に省略されている場合のみである。
データ型が省略されていない場合、( )を省略することはできない。

/* h */
(val) -> {
  return true;
};
・引数のデータ型を省略

○ コンパイル可能

引数のデータ型は省略が可能である。
その場合、すべての引数のデータ型を省略しなければならない。

/* i */
val -> {
  return true;
};
・引数のデータ型と( )を同時に省略

○ コンパイル可能

引数が1つで、引数のデータ型が省略されている場合に限り( )を省略することができる。
※引数が2つ以上の場合や引数が無い場合は必ず( )を書く必要がある。

/* j */
() -> {
  return true;
};
・引数を省略

× コンパイルエラー

引数を省略することはできない。
※ただし、将来的に何らかの変更が加わる可能性はある。

/* k */
val -> true;
・引数のデータ型と、( )を同時に省略 ※1

・return キーワードと( )を同時に省略 ※2

○ コンパイル可能

今回可能な省略をすべて使用した形。

引数が無かったり、引数が2つ以上ある場合は※1の省略ができない。
return 文を含めて、処理が2行以上ある場合は※2の省略ができない。

 

以上をまとめると次のようになる。

 

ラムダ式の省略可否一覧
省略個所 省略の可否  注意点
 引数のデータ型 ○ 省略可能 ・データ型が省略されている引数とされていない引数が混ざっている場合は省略できない。

※省略する場合は必ずすべての引数のデータ型を省略すること。

引数の( ) △ 省略可能
※ 条件付き
・引数なしの場合は省略できない。

・引数が2つ以上の場合は省略できない。

・ 引数のデータ型が書いてあると( )は省略できない。

 

※引数が1つで、データ型が省略されている時のみ省略可能。

処理の{ } △ 省略可能
※ 条件付き
・処理が2行以上にわたる場合は省略できない。

・処理が ; しかない場合は省略できない。(プログラムの構造がおかしくなるため)

・戻り値がある場合、return キーワードが書いてあると省略できない。

 

※処理が1行しかない場合は省略可能。戻り値がある場合は下記参照。

(戻り値がある場合)
return キーワード
△ 省略可能
※ 条件付き
・return 文以外の処理もある場合は省略できない。

・{ } が書いてあると省略できない。

 

※ 処理内容がreturn 文のみで、{ }も省略する場合のみ省略可能。その場合、処理内容には戻り値のみが書かれる。

戻り値そのものがなくなるわけではないので注意。

引数名 × 省略できない  ・引数名は省略できない。

 

※ただし、引数名はもとのインタフェースと異なっていても良い。ローカル変数のスコープに注意して変数名を定義すること。

 

 

 

そのほかのjavaの練習問題はこちら

そのほかのjava関連の記事はこちら

  • このエントリーをはてなブックマークに追加

PAGE TOP