代码之家  ›  专栏  ›  技术社区  ›  FirstOne

可以处理子类类型的超类中的泛型

  •  0
  • FirstOne  · 技术社区  · 6 年前

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

    重复代码示例

    客户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
        }
    }
    

    富。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。

    正如您所看到的,这是重复的,只会改变 某物 。班这也可以用于其他事情,例如 findAll()

    预期方式

    我的意图是这样使用它:

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

    问题

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

    公共类MyBaseClass扩展了SugarRecord{ 公共静态T findbyuid(c类,字符串uuid){ 列表结果=查找(c,“uuid=?”,uuid); 返回结果。获取(0); } }

    这样称呼:

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

    但我想省略 某物 。班


    有没有办法做到这一点?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Andreas LppEdd    6 年前

    使生效 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");