teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2018/03/16 03:09

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -43,4 +43,42 @@
43
43
 
44
44
  NO
45
45
 
46
- ローカル変数だけでなくフィールドを覚えてください。というよりインスタンスとは何かを覚えましょう。おそらくそれがまだお分かりになっていない気がします。
46
+ ローカル変数だけでなくフィールドを覚えてください。というよりインスタンスとは何かを覚えましょう。おそらくそれがまだお分かりになっていない気がします。
47
+
48
+ ---
49
+ 追記:質問者さんのコードへの捕捉
50
+
51
+ JavaFXではラムダ式を使う場面が非常に多いと思いますので、コメントに書いた「ラムダ式の引数の型を省略していいことが多い」について補足します。
52
+
53
+ ```java
54
+ // 型を指定してもよい (A)
55
+ btn.setOnAction((ActionEvent event) -> {
56
+  timestamp.add(LocalTime.now());
57
+  ...
58
+ });
59
+ // しかし大抵の場合省略できる (B)
60
+ btn.setOnAction(event -> {
61
+  timestamp.add(LocalTime.now());
62
+  ...
63
+ });
64
+ ```
65
+ 省略できないケースというのはラムダ式の引数の型の候補が複数ありえるようなケースです。例えばButtonクラスに定義されているのは下記(A)だけですが、もし(B)も定義されていたとしたら省略できないのですね。
66
+ ```Java
67
+ public class Button ... {
68
+ public void setOnAction(EventHandler<ActionEvent> handler) { ... } // (C)
69
+ public void setOnAction(EventHandler<OtherType> handler) { ... } // (D)
70
+ }
71
+ ```
72
+ このようなオーバーライドメソッドが複数あるケースでは(B)のように引数を省略すると(C)の呼び出しなのか(D)の呼び出しなのか一意に決められないためラムダ式の引数の型を省略できません。(省略するとコンパイルエラーになります)
73
+
74
+ しかしながらJavaFX(多分他の多くの場面でも)こうしたオーバーライドメソッドがあることは稀で大抵の場合省略しても型が一意に決まります。若干微妙な例が
75
+
76
+ `ObservableValue#addListener(ChangeListener<T> l);`
77
+ `ObservableValue#addListener(InvalidationListener<T> l);`
78
+
79
+ なんですが、ChangeListnerの引数の型が3つでInvalidationListenerの引数の型が1つという違いがあるため、このケースでも方は省略できるということを覚えておくとよいかも知れません。
80
+
81
+ `observable.addListner((observable, oldValue, newValue) -> {...});` (E)
82
+ `observable.addListner((observable) -> {...});` (F)
83
+
84
+ 引数の数が違うので(E)はChangeListener、(F)はInvalidationListnerであることをコンパイラーはちゃんと推測してくれコンパイルエラーにはならないのです。