您好我有以下两种方法
第一
public ObjectId getObjectIdByRegionName(Region region) {
Query<Region> query = datastore.createQuery(Region.class);
query.field("R_NAME").equal(region.getName());
return query.get().getId();
}
第二
public ObjectId getObjectIdByNationName(Nation nation) {
Query<Nation> query = datastore.createQuery(Nation.class);
query.field("N_NAME").equal(nation.getName());
return query.get().getId();
}
我怎么能把它们变成通用方法?
答案 0 :(得分:2)
试试这个:
public <T> ObjectId getObjectByName(T name)
或者将它们添加到使用泛型的接口或类中:
public interface LocationDao<T extends Nameable> {
ObjectId findByName(T location);
}
所以现在你需要这样的东西:
public interface Nameable {
String getName();
}
如评论中所述,您需要一个具有getName()
方法的参数。你需要一个限制才能做到这一点。
答案 1 :(得分:2)
虽然duffymo的方法更可取(更干净等),如果您无法控制参数类的源(或者您不能强加接口等),您可以这样做:
public <T> ObjectId getObjectIdByNationName(T param, String name, String fieldName) {
Query<T> query = datastore.createQuery((Class<T>)param.getClass());
query.field(fieldName).equal(name);
return query.get().getId();
}
甚至这个非泛型版本(因为你可以不用类型范围):
public ObjectId getObjectIdByNationName(Object param, String name, String fieldName) {
Query<?> query = datastore.createQuery(param.getClass());
query.field(fieldName).equal(name);
return query.get().getId();
}
然而,调用者每次都要使用字段名称和名称进行重复操作。如果仅从一个位置调用每个参数类型,则不会重复。