1

私は次のものを持っていますinterface

public interface Identifiable {

    public Comparable<?> getIdentifier();

}

そして実装クラス

public class Agreement implements Identifiable {

    private Long id;

    public Comparable<Long> getIdentifier() {
        return id;
    }
}

EDIT:異なるタイプの識別子を持つ他の実装があるかもしれないことに注意してください。
ここで、はい、比較対象を比較したいと思います。

// Agreement a;
// Agreement b;
...
if (a.getIdentifier().compareTo(b.getIdentifier()) {
...

しかし、compareTo次のコンパイラ エラーが表示されます。

タイプ Comparable<Long> のメソッド compareTo(Long) は、引数 (Comparable<Long>) には適用されません。

このインターフェースは Generics でどのように使用されることになっていますか?

4

1 に答える 1

10

Comparable<T>ジェネリック パラメータの上限として使用することを意図しています。

public interface Identifiable<T extends Comparable<T>> {    
    public T getIdentifier();
}

public class Agreement implements Identifiable<Long> {

    private final Long id;

    public Long getIdentifier() {
        return id;
    }
}

これにより、戻り値の型Tが と比較できるものだけでなく、 になりTます。


あなたのコードは本質的に安全ではありません。
理由を理解するには、次のコードを検討してください。

class Funny implements Comparable<Long> { ... }
class Funnier implements Identifiable {
    public Comparable<Long> getIdentifier() {
        return new Funny();
    }
}

Identifiable<Funny> funnier;
funnier.getIdentifier().compareTo(funnier.getIdentifier());
// You just tried to pass a Funny to compareTo(Long)
于 2012-08-22T13:46:32.367 に答える