我对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。 BooksByPrice类的整个主体可能会发生变化,但界面必须保持原样在代码中。有没有办法在BooksByPrice类中实例化泛型类型T,以便它可以使用书籍的方法和字段?否则,我认为select方法没有理由将泛型作为参数。
感谢您的帮助。
答案 0 :(得分: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
是否需要对不同的图书子类通用。