-6
パラメータとしてサブクラスを入力する可能性がある場合、上限を持つ汎用ワイルドカード関数がサブクラスのメンバーにアクセスできないのはなぜですか?Java汎用ワイルドカード関数
パラメータとしてサブクラスを入力する可能性がある場合、上限を持つ汎用ワイルドカード関数がサブクラスのメンバーにアクセスできないのはなぜですか?Java汎用ワイルドカード関数
class Super{
void superMethod(){}
}
class Sub extends Super{
void subMethod(){}
}
class Sub2 extends Super{
void subMethod2(){}
}
static <T extends Super> void processSuper(T input){
// this is safe and compiles
input.superMethod();
// this doesn't compile
input.subMethod();
// nor this
input.subMethod2();
}
上記のコードスニペットをご覧ください。 extend Boundを使うと、実際の型が何であるかわからない。コンパイラは、任意の型のサブタイプを認識していないので、そのメソッドが何であるかを知る方法がありません。そして、たとえそうしたとしても、これは他のどのサブタイプでもこのメソッドを使用できなくすることを意味します。
if(input instanceof Sub){
((Sub) input).subMethod();
}
これはコンパイルが、それは非常に悪いスタイル(密結合)と考えられています:
もちろんinstanceof
チェックでそれを行うことができます。 より良いOO設計は、Sub
とSub2
の異なる機能にsuperMethod()
代理人を委任することです。
TL;コンパイラは、サブタイプを知っていないため、DR は、あなたが望むものを達成することはできません。それがうまくいっても、恐ろしいOOデザインになるでしょう。
このような一般的な質問に答えることは不可能です。いくつかのコードを共有し、正確に何が問題になっているのかを強調してください。 – Mureinik
この回答を読んで:https://stackoverflow.com/a/2723538/342852 –
ようこそスタックオーバーフロー!ようこそ!デバッグの助けを求める質問(「なぜこのコードは動作しませんか?」)には、目的の動作、特定の問題またはエラー、および質問自体の中でそれを再現するのに必要な最短コードが含まれていなければなりません。明確な問題文がない質問は、他の読者にとって有用ではありません。参照:[mcve]を作成する方法。あなたの*質問*を改善するために "編集"リンクを使用してください - コメントでより多くの情報を追加しないでください。ありがとう! – GhostCat