我有一个功课,指定在现有项目中添加通用存储库层。我面临的问题如下。我的存储库应该封装存储数据的映射。我到现在所拥有的是以下内容:
public interface IDObject<T> {
public Comparable<T> getID();
}
public class Person implements IDObject<String> {
private String cnp;
private String name;
private String age;
public Person(String cnp, String name, String age) {
this.cnp = cnp;
this.name = name;
this.age = age;
}
public void setName(String name) { this.name = name; }
public void setCNP(String cnp) { this.cnp = cnp; }
public void setAge(String age) { this.age = age; }
public String getName() { return name; }
public String getCNP() { return cnp; }
public String getAge() {return age; }
public String toString() { return cnp + "-" + name + "-" + age; }
@Override
public Comparable<String> getID() { return getCNP(); } //basically the unique identifier
}
public class Repository<T extends IDObject<?????????>>{
private IMap map;
public Repository() {
map = new Map<???????, T>();
}
...
}
所以我的问题出现在Repository类中。我想存储人员,所以我会做类似Repository<Person> repo = new Repository<Person>();
的事情但问题是我不知道如何在Repository构造函数中构造地图。换句话说,我不知道密钥的类型。我希望Person的cnp
是键(类型为String
),但如果我强制地图将键定义为字符串,我的存储库不再是通用的,因为如果我想要添加一些将键作为整数的Animal对象,地图应该像map = new Map<Integer, T>();
。
所以问题是我如何仍然使用像Repository<Person> repo = new Repository<Person>();
这样的结构,使用存储在存储库中的对象实现IDObject
并知道存储库封装存储数据的映射这一事实?我应该如何知道密钥,以便完成存储库类?
答案 0 :(得分:0)
您必须引入另一种通用类型:
public class Repository<T, O extends IDObject<T>>
之后,您可以将StringIDRepository引入为
public class StringIDRepository<O extends IDObject<String>> extends Repository<String, O>
替代方法是使用Map<Object, O>
,但这需要您在Repository类中使用以对象作为参数的getById方法。
希望这会有所帮助!