超类中可以处理子类类型

时间:2018-06-18 18:17:04

标签: java android generics inheritance sugarorm

我正在尝试将重复的代码移动到父类中,但此类代码使用特定类中的“详细信息”。

重复代码示例

Client.java

class Client extends SugarRecord {
    private String uuid; // name, etc
    public static Client findByUuid(String uuid){ // null check
        List<Client> clients = find(Client.class, "uuid = ?", uuid);
        return clients.get(0); // simplified, but checks for empty list and ret. null
    }
}

Foo.java

class Foo extends SugarRecord {
    private String uuid; // bar, etc
    public static Foo findByUuid(String uuid){ // null check
        List<Foo> foos = find(Foo.class, "uuid = ?", uuid);
        return foos.get(0); // simplified, but checks for empty list and ret. null
    }
}

注意:SugarRecord来自SugarORM。

正如您所看到的,这是重复的,只会更改 Something .class。这也可以用于其他事情,例如findAll()

预期的方式

我的目的是像这样使用它:

Client client = Client.findByUuid("abc");

问题

当我尝试将代码移动到父类时,我不知道如何解析泛型类型并使其以所需方式调用。例如,我可以在父类中声明一个方法:

public class MyBaseClass扩展SugarRecord {     public static T findByUuid(Class c,String uuid){         列表结果= find(c,“uuid =?”,uuid);         return result.get(0);     } }

这样称呼它:

Client cli = Client.findByUuid(Client.class, "something");

但我想省略 Something .class。

有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:1)

在基类中实现findByUuid(Class<T> c, String uuid)

class SugarRecord {
    protected static <T> T findByUuid(Class<T> c, String uuid) {
        List<T> result = find(c, "uuid = ?", uuid);
        return result.get(0);
    }
}

从子类方法中调用它:

class Client extends SugarRecord {
    public static Client findByUuid(String uuid) {
        return findByUuid(Client.class, uuid);
    }
}

按照您的意愿使用它:

Client client = Client.findByUuid("abc");