2016-11-14 11 views
2

ほとんどすべてのメソッド引数と戻り値の型が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つの機能的に同一の方法がありました気づきました私は、legacyMethodWrapper1legacyMethodWrapper2との間に、legacyMethodWrapper2というオブジェクトが追加でClassオブジェクトにアクセスするという微妙な違いがありませんでした。キャスト以外の複雑な操作を行う可能性がありますか?

編集:これらのレガシーメソッドをラップする目的の1つは、発信者にタイプセーフティを提供し、2)呼び出し元に意味のない警告が表示されないようにすることです。コンパイラーが知ることのできないレガシークラスのことを知っているので、100%型の安全なインターフェースを提供し、無意味なコンパイラーの警告を隠すことができます。

+0

-

以下は私の感想です。特に、ラッパー1とラッパー2は実際には生のタイプを使用するよりも大幅に異なる何もしません。 – scottb

+0

もちろん、コンパイラはコード*が*型安全であることを実際に知ることができません。そのため、キャストとコンパイラの警告をラップして隠す必要があります。 –

答えて

1

必ずしも必要でない限り、タイプごとに別々のメソッドを作成する必要はありません。 Javaコンパイラは、あなたのコードがタイプセーフでないことができ、未チェックのキャストの警告をスローした場合

class LegacyWrapper{ 
private Legacy legacy = new Legacy(); 
    public <T> T legacyMethodWrapper(Object obj ,Class<T> clazz) throws ClassCastException{ 
    return clazz.cast(legacy.legacyMethod(obj)); 
    } 
} 
+1

これは私がやる方法ですが、 'public string getString(Object obj){return legacyMethodWrapper(obj、String.class)}のように、このメソッドをラップした主な型(String、Integerなど) );} ' – Bohemian

+0

私の目標は、キャストを隠す具体的な型のメソッドを提供することで、呼び出し側のコンパイラの警告を防ぐことでした。一般的なバージョンを公開したり、例外をスローしたりしたくない... –

+0

コンパイラ警告は自分たちの仕事をしています。あなたのコードが型安全でないかもしれないことを知らせています。危険にさらされないようにしてください。ここでの最良の解決策は、生の型を生成して汎用型にすることです。それがなければ、生の型をラップするだけで、たとえ抑止してはいけないというコンパイラ警告を抑止するだけの利点はありません。あなたのコードが本当に安全であることを証明できれば、 '@ SuppressWarnings'を使用します。 – scottb

関連する問題