如何将这两种方法转换为通用方法?

时间:2012-03-25 11:56:59

标签: java generics

您好我有以下两种方法

第一

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

我怎么能把它们变成通用方法?

2 个答案:

答案 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();
}

然而,调用者每次都要使用字段名称和名称进行重复操作。如果仅从一个位置调用每个参数类型,则不会重复。