次のコードを検討してください。
public class Generics {
C c; // initialized at runtime
public void testGenericsCall(Object o) {
c.myMethod(o);
}
}
class C<E> {
public void myMethod(E input) {
}
}
これは機能していますが、パラメータ化されたクラスCがraw型で使用されているため、警告が表示されます。私は次のような宣言を使用できません
C<String> c;
Cのタイプは実行時にのみ認識されるためです。また、Cの型を知る前にこのクラスのオブジェクトを作成する必要があるため、Genericsクラスに型パラメーターを追加することはできません。宣言
C<?> c;
また
C<? extends Object> c;
コンパイラーにとっては問題ありませんが、メソッドtestGenericsCallはコンパイルされません(「実際の引数java.lang.Objectは、メソッド呼び出し変換によって?のキャプチャ#1に変換できません」)
このような状況に対処するための最良の方法は何ですか?
編集:私が実際に(実行時に)Cのインスタンスを作成するとき、その型パラメーターを知っていることに注意してください。コードのこの部分は型セーフであり、うまく機能しています。実際のコードでは、単一の「C」クラスはありませんが、一連の相互に関連するクラスがあり、ジェネリックは間違いなく便利です(この単純化された例では、これは明らかではありません。したがって、単に教えないでください)私はジェネリックを使用しないでください:)。私はすでにコンパイル時の型安全性を持っていますが、ここではありませんが、Cと他のクラス(ここには示されていません)の間です。
この場合、コンパイル時にtypeパラメーターをチェックできないことがわかります。そのため、宣言しようとしました C<?> c
。ここでは、コンパイラの警告なしにジェネリックコードと非ジェネリックコードをブリッジするための最良の方法を探しています。