Comparatorを生成するstaticメソッドやdefaultメソッドの使用方法で、Comparatorのメソッドを続けて呼び出す際に(なんか用語ありましたっけ?)、型を指定しないとコンパイルエラーとなってしまう原因が分かりません。
###List<Element>をCollections.sortを使ってn1>n2>n3の昇順に並び替える
- Elementクラス(getterは省略してます)
java
1class Element { 2 int n1; 3 int n2; 4 int n3; 5 public Element(int n1, int n2, int n3) { 6 this.n1 = n1; 7 this.n2 = n2; 8 this.n3 = n3; 9 } 10}
2.これは問題ない
java
1List<Element> list = new ArrayList<>(); 2/* listに値を入れる処理 */ 3Collections.sort(list, Comparator.comparingInt(e -> e.n1));
3.こうするとコンパイルエラー
java
1Collections.sort(list, Comparator.comparingInt(e -> e.n1) 2 .thenComparingInt(e -> e.n2) 3 .thenComparingInt(e -> e.n3));
4.comparingの前に型を指定するか
java
1Collections.sort(list, Comparator.<Element>comparingInt(e -> e.n1) 2 .thenComparingInt(e -> e.n2) 3 .thenComparingInt(e -> e.n3));
5.ラムダ式の引数に型を入れれば通る
java
1Collections.sort(list, Comparator.comparingInt((Element e) -> e.n1) 2 .thenComparingInt(e -> e.n2) 3 .thenComparingInt(e -> e.n3));
3.が通らないのは型を指定しないとComparator<Object>が返るからでしょうか?
ではなぜ、指定していない2.が通り、3.がダメで、4.と5.が通るのか分かりません。
以下に疑問点をまとめます。
2. → 型を指定してないのに通るのはなぜか
3. → 続けてthenComparingを呼べないのはなぜか
5. → ラムダ式に型を入れるだけで4.と同じ効果を得られるのはなぜか
型パラメータについての知識が稚拙ですが、ご教授ください。
追記:
コンパイルエラーは以下が表示されます
n1 は解決できないか、フィールドではありません
n2 は解決できないか、フィールドではありません
n3 は解決できないか、フィールドではありません
回答2件
あなたの回答
tips
プレビュー