2

Java のジェネリックについて質問がありますが、答えが見つかりません。これが私の現在のコードです:

interface ISelect<T>{
    // a predicate that determines the properties of the given item
    public boolean select(T t);
}

class BookByPrice<T> implements ISelect<T> {
    int high;
    int low;

    public BookByPrice(int high, int low) {
        this.high = high;
        this.low = low;
    }

    public boolean select(T t) {
        return t.getPrice() >= this.low && t.getPrice() <= this.high;
    }
}

したがって、基本的には、インターフェイス ISelect を実装し、リスト実装として機能するクラスの別のインターフェイスのフィルター メソッドで使用される述語として機能するこのクラス BooksByPrice を定義する必要があります。BooksByPrice には、書籍の価格が安値と高値の間にある場合に true を返すこのメソッド select が必要です。BooksByPrice クラスの本体全体は変更される可能性がありますが、インターフェイスはコード内にそのまま残す必要があります。本のメソッドとフィールドを使用できるように、クラス BooksByPrice でジェネリック型 T をインスタンス化する方法はありますか? それ以外の場合、select メソッドがジェネリックをパラメーターとして持つ理由はわかりません。

助けてくれてありがとう。

4

1 に答える 1

4

T上限を指定する必要があります:

class BookByPrice<T extends Book> implements ISelect<T> {

    ...

    public boolean select(T book) {
        return book.getPrice() >= this.low && book.getPrice() <= this.high;
    }
}

またはISelect、具象型引数を使用して実装します。

class BookByPrice implements ISelect<Book> {

    ...

    public boolean select(Book book) {
        return book.getPrice() >= this.low && book.getPrice() <= this.high;
    }
}

どのアプローチを使用するかBookByPriceは、ブックのさまざまなサブクラスに一般的である必要があるかどうかに応じた設計上の決定です。

于 2013-03-07T05:37:04.160 に答える