我无法让接口按照我希望使用泛型的方式工作。
我有一个 CRUD 风格的界面来处理各种对象的数据访问。Comparable<?>
用于通过标识符获取对象,因为对象可能具有不同类型的标识符:
public interface DataProvider<T> {
T create(T object);
T get(Comparable<?> id);
void update(T object);
void delete(T object);
}
现在想象一个需要访问的(人为的)对象,Book
:
public class Book implements Comparable<Book> {
private ISBN isbn;
public int compareTo(Book other) {
return getIsbn().compareTo(other.getIsbn());
}
// ...
}
我希望能够做到的是:
public class BookDataProvider implements DataProvider<Book> {
public Book create(Book book) { ... }
public Book get(ISBN isbn) { ... }
public void update(Book book) { ... }
public void delete(Book book) { ... }
}
修改DataProvider
和/或Book
允许get(ISBN)
编译的最简单方法是什么?
我提出了几个部分解决方案,但我不确定是否是最优的:
- 键入
DataProvider
asDataProvider<T, I extends Comparable<I>>
,但这会增加一个额外的类型参数。 - 根据这个相关帖子介绍一个
Identifiable
接口,实现它,然后键入as ,但是我没有实现.Book
DataProvider
DataProvider<T extends Identifiable<?>>
get(ISBN)
理想情况下,我想限制DataProvider
只有一个类型参数。我也对其他方法持开放态度。谢谢。