【问题标题】:Generic in superclass that can handle child class type可以处理子类类型的超类中的泛型
【发布时间】:2018-11-27 15:26:57
【问题描述】:

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

重复代码示例

客户端.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");

问题

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

公共类 MyBaseClass 扩展 SugarRecord{ 公共静态 T findByUuid(类 c,字符串 uuid){ 列表结果 = find(c, "uuid = ?", uuid); 返回结果.get(0); } }

这样称呼它:

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

但我想省略 Something.class。


有没有办法做到这一点?

【问题讨论】:

    标签: java android generics inheritance sugarorm


    【解决方案1】:

    在基类中实现findByUuid(Class&lt;T&gt; 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");
    

    【讨论】:

    • 这要求每个孩子都有一个findByUuid。到目前为止,我有一个 DatabaseUtil 类,它具有与您相同的通用方法,并且我从每个“常规”类中调用它的方式与您的子类示例相同。没关系,但我一直在寻找替代品 xD。无论如何,感谢您的意见。
    • 顺便说一句,SugarRecord 是 BaseClass 的超类(共 3 个级别)。我编辑了您的答案,以便其他使用它的人理解。希望你不要介意。
    • @FirstOne 我确实介意,因为更改使答案不适合问题。你知道,在哪里写的问题class Client extends SugarRecord
    • SugarRecordSugarORM 的一个类,不是我的。所以不可能存在SugarRecordfindByUuid 方法。这个想法是创建一个中产阶级来拥有重复的代码。所以,Cliente extends MyBaseClassMyBaseClass extends SugarRecordSugarRecord 是带有方法find 的那个。它非常适合这个问题。
    • @FirstOne 这是您设置的细节,没有涉及到问题,并且不影响答案的概念。 findByUuid(Class&lt;T&gt; c, String uuid) 甚至不必在基类中,它可以在任何地方,例如在助手/实用程序类中。请记住,StackOverflow 的答案是通用的,不一定 100% 适合您的特定问题,尽管我的答案在我写的时候确实 100% 适合这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    • 1970-01-01
    • 2019-06-12
    相关资源
    最近更新 更多