ほとんどすべてのメソッド引数と戻り値の型がObject
である複雑なレガシークラスと対話する必要があります。Java:汎用戻り型、クラスパラメータとブラケット付き呼び出しの違い?
私のコードでは、私は機能の小さな部分のみを扱うことになり、使用されるすべての引数と戻り値の型の正確な型を知っています。私のコードをより使いやすくするために、具体的な型だけを使って作業する必要のあるキャスティングを埋葬したいと思います。場合、私は興味があった、ここに示す簡単なコードで任意の機能的な違いがあるようには思えませんが
public class LegacyClass {
public Object legacyMethod(Object o) {
...
}
}
LegacyClass foo = new LegacyClass();
private <T> T legacyMethodWrapper1(String s) {
return (T) foo.legacyMethod(s); //Warning: unchecked cast
}
private <T> T legacyMethodWrapper2(String s, Class<T> c) {
return (T) foo.legacyMethod(s); //Warning: unchecked cast
}
public String getLegacyDataString1(String s) {
return this.<String>legacyMethodWrapper1(s);
}
public String getLegacyDataString2(String s) {
return this.legacyMethodWrapper2(s, String.class);
}
:私は、従来のクラスのメソッドをラップする可能性が2つの機能的に同一の方法がありました気づきました私は、legacyMethodWrapper1
とlegacyMethodWrapper2
との間に、legacyMethodWrapper2
というオブジェクトが追加でClass
オブジェクトにアクセスするという微妙な違いがありませんでした。キャスト以外の複雑な操作を行う可能性がありますか?
編集:これらのレガシーメソッドをラップする目的の1つは、発信者にタイプセーフティを提供し、2)呼び出し元に意味のない警告が表示されないようにすることです。コンパイラーが知ることのできないレガシークラスのことを知っているので、100%型の安全なインターフェースを提供し、無意味なコンパイラーの警告を隠すことができます。
-
以下は私の感想です。特に、ラッパー1とラッパー2は実際には生のタイプを使用するよりも大幅に異なる何もしません。 – scottb
もちろん、コンパイラはコード*が*型安全であることを実際に知ることができません。そのため、キャストとコンパイラの警告をラップして隠す必要があります。 –