as
から、T2
に課す制約に基づいてコンパイラがコンパイル時に決定できないメソッドを呼び出すことはできません。
T2
にはObject
というものがありますので、toString
、hashCode
などのように宣言されたメソッドしか呼び出せません。かなり役に立たなくなります。
T2
タイプ(したがってT
)を絞り込んで、より具体的なクラスやインターフェイスを絞り込むことができれば、メンバメソッドにアクセスできます。例えば、T、つまりT2が保証されているとします。 Number
ですので、intValue
と電話することができます。私は実際T
でgetSequence
方法を定義するいくつかのクラスであるためにあなたのコードに制限されていることを推測としておそらくあなたに、このようなgetSequence
などT
方法で問題を解決するだろう
。 SequenceContainer
と呼ばれるとしましょう。
protected <T extends SequenceContainer, T2 extends T> SortedMap<Integer, T2> noNameFunction(List<T> things, T2 ts) {
SortedMap<Integer, Object> sortedMap = new TreeMap <> ();
for (T t: things) {
T2 as = ((T2) t);
sortedMap.put (as.getSequence(), as.t2OwnMethod()); // fail to compile, due to the call to t2OwnMethod.
}
return sortedMap;
}
完全な解決策は、呼び出し元がメソッド内で呼び出す必要のあるT2コードを提供できるラムダを使用することです。
protected <T extends SequenceContainer, T2 extends T, X> SortedMap<Integer, X> noNameFunction(List<T> things, T2 ts, Function<T2, X> valueFunction) {
SortedMap<Integer, Object> sortedMap = new TreeMap <> ();
for (T t: things) {
T2 as = ((T2) t);
sortedMap.put (as.getSequence(), valueFunction.apply(as)); // fail to compile, due to the call to t2OwnMethod.
}
return sortedMap;
}
私は第三のタイプX
に返されたソートマップの値を一般化するには、この機会をとっているのお知らせ...これは単にT2
ことができ、あなたが提供するどのようなラムダによってはコンパイル時にシームレスに解決されます。今、あなたは、t2OwnMethod
戻っ...文字列が言うと仮定して、この署名を呼び出すような方法がある:
List<? extends SequenceContainer> scs = ...;
SpecialSequenceContainer exampleSSC = ...; /// SpecialSequenceContainer extends
SortedMap<Integer, String> option1 = noNameFunction(scs, exampleSSC, ssc -> ssc.t2OwnMethod());
// or
SortedMap<Integer, String> option2 = noNameFunction(scs, exampleSSC,
SpecialSequenceContainer::t2OwnMethod);
さて、二番目のパラメータ(exampleSSC)はかなり無駄です...ので、あなたは、単にそれを省略することができることを予告。
私たちは、さらにここに行くとJavaは、質問コードですべての作業を行うためにストリームを使用することができます:キーの衝突がある場合に(s1, s2) -> s1
ラムダはそれだけではなることはないかもしれない、呼び出されることを
final SortedMap<Integer, String> result = myScs.stream()
.map(t -> (SpecialSequenceContainer) t)
.collect(SequenceContainer::getSequence,
SpecialSequenceContainer::t2OwnMethod,
(s1, s2) -> s1,
TreeMap::new);
お知らせ大文字と小文字は区別されますが、値をマージする機能は必要ありません。
'instaceof'を使ってみましたか? https://stackoverflow.com/questions/6601132/instanceof-keyword-usage – xsami
ここであなたはt変数を使用していますか?あなたが何もキャストしてはいけませんジェネリックを使用するとき –
のように思えます。ジェネリック医薬品を介してタバコを扱います。 –