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;
    }
}

所以,基本上,我必须定义这个类 BooksByPrice 来实现接口 ISelect 并充当谓词,以便在另一个充当列表实现的类接口中的过滤器方法中使用。BooksByPrice 应该有这个方法 select 如果一本书的价格在低和高之间,则返回 true。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 回答