2

私は Java を学んでいますが、この質問は言語固有のものではないと思います。誰かが既に質問をしている場合は申し訳ありませんが、検索クエリでこれをどのように表現すればよいかわかりません。

自分でいくつかのジェネリック メソッドを実装した直後に、次のことに気付きました。私が思いついた「ハック」は、インターフェイスを上限として使用してパラメーターの入力タイプを制限することです。compareTo() のような一般的な機能については、インターフェイス Comparable が十分に普及しているため問題ありませんが、ジェネリックを機能させるためだけにカスタム インターフェイスを作成する必要があるのは面倒です。

私のナンセンスを理解するのに役立つコードを次に示します。ジェネリック データ型のコレクション内の一意の要素をカウントしようとする、次の動作しないコードを考えてみましょう。

public static <T> int countUnique(Collection<T> c) {
    int count = 0;
    for(T t : c) {
        count += (t.isUnique()) ? (1) : (0);
    }
    return count;
}

tオブジェクトに method がない (またはコンパイラがオブジェクトにあると判断できない) とコンパイラが不平を言うと、明らかな問題が発生しますisUnique()。私の解決策:

public interface unique {
    public boolean isUnique();
}

public static <T extends unique> int countUnique(Collection<T> c) {
    int count = 0;
    for(T t : c) {
        count += (t.isUnique()) ? (1) : (0);
    }
    return count;
}

質問: 毎回これを行う必要がありますか? ダサくない?代わりに採用すべき標準的な慣行はありますか?

4

1 に答える 1

0

これが OOP の主な原則です。オブジェクトを操作しており、オブジェクトには動作 (メソッド) があります。

すべてのメソッドは、どのオブジェクトを操作しているかを認識しています。たとえば、メソッドは 2 つの数値を比較します。1 つの数値と 1 つの文字列の配列を渡すと、それらを比較することはできません。

例ではインターフェイスを上限として使用する必要はありません。クラスにすることができ、同様の動作を持つ2つのクラスがある場合は、インターフェイスを作成し、上記のメソッドを変更してそのインターフェイスを使用します。

また、Java Code Conventionsにより、インターフェース名は大文字で始める必要があります。

于 2013-06-16T18:59:28.367 に答える