ここでは、2つの単純なクラスDad
とSon
を作成します.SonはDadのサブクラスです。Java8:ラムダ関数のジェネリックバージョンのコンパイルエラー
public class Dad {
}
public class Son extends Dad {
}
は、その後、私は
public class Test {
public static void main(String[] args) {
Function<? extends Dad, String> fun = son -> son.toString();
fun.apply(new Son());
}
をテストするために、他のクラスのFunction
を作成しかし、私はfun.apply(new Son())
にコンパイルエラーに出くわし、それは)目的球でcaptrueは(息子にappiledすることはできません(適用されます」と言っ) '。私は混乱しています、fun
はDad
を拡張するクラスのparamを必要とします、私はサブクラスを与えますが、まったくそうではありません。
さらに情報があります!私は
最後に、私はときに使用することができたのparam分からない「(目的球でcaptrueは(お父さん)にappiledすることはできません)を適用」fun
ためのparamとしてnew Dad()
を試してみてください、だけでなく、エラーメッセージが表示されました汎用バージョンのFunction
ヘルプ~~~ ありがとうございます! (⊙o⊙)
あなたは何をしようとしているか説明できますか?あなたの関数の引数が '拡張Dad'であることを知っているなら、なぜ' Function <? 'の代わりに 'Function 'を使うことができませんか? Dad、String> 'を拡張しますか? – sprinter
最初は、要素名がSON1とSON2のenumを持ちます。ここではSon1とSon2の両方のトウクラスがあり、どちらもパパを拡張しています。外部からは、SON1やSON2のような列挙型の名前をparamとして取得しました。列挙型の名前でデータベースからSon1またはSon2にクエリを行い、Son1またはnick2の属性名を返します。両方の属性はStringですが、私は、現在の列挙型を判断するためにifブロックを使用したくないので、名前で列挙型を取得し、列挙型でデータベースにクエリし、列挙型から必要な属性を取得したいだけです – Tony
したがって、属性< extends Dad、String>列挙型で、SON1(Son1 son1 - > son1.getName())。 SON2(Son2 son2 - > son2.getNickName())。しかし、私がそれを適用すると、私はちょうど私が示すようにコンパイラのエラーを得ました。手伝っていただけませんか? ( – Tony