は、私は次のシグネチャを持つメソッドがあると仮定:この方法は、(文字列キーを用いて)機能のマップを受け付けるタイプ安全Comparator.comparing()に渡される関数のインスタンスを作成
<T, U extends Comparable<? super U>> Comparator<T> method(Map<String, Function<? super T, ? extends U>> comparatorFunctionMap)
および作成します結果としてComparator<T>
(それはどのように重要ではない)。マップ値はFunction<? super T, ? extends U>
のインスタンスなので、直接Comparator.comparing()
に渡すことができます。
タイプセーフな方法でこのマップにデータを設定するにはどうすればよいですか?私は、属性name
とage
を持つクラスPerson
を持っているとしましょう。
は、私は次の操作を行うときは:私が代わりにこれをしようとした場合
Map<String, Function<? super Person, ? extends Comparable>> map1 = new HashMap<>();
map1.put("name", Person::getName);
method(map1);
私は例えば、ライン1と3の警告を受ける:
Map<String, Function<? super Person, ? extends Comparable<?>>> map2 = new HashMap<>();
map2.put("name", Person::getName);
method(map2);
三行目は、コンパイルエラーです。
これを安全に行う方法はありますか?
私はあなたの最初のスニペット(生の比較可能性)を使って警告を受け取りません。 – Eran
複数の型を返すにはマップ内の関数が必要ですか?例えば、同じマップが 'Function'と 'Function 'を保持できる必要がありますか? –
@MikeStrobel:そうですね、考えられるのは異なる比較可能なタイプ(少なくとも文字列と数字ですが、おそらく他のものも可能です)をマップにまとめておくことでした。私は今これが主要な問題だと思う。 – Ondra