Как уже отмечали другие, я не думаю, что проблема решаема в Java, как вы ее представляете. Статический метод на самом деле не наследуется так же, как нестатический метод. (Извините, если я не совсем правильно использую терминологию.)
Тем не менее, мне кажется, есть много способов добиться желаемого результата, если вы захотите немного изменить свой интерфейс.
Наиболее очевидным было бы просто сделать вызов с использованием родительского класса. Что не так с написанием
Person person=(Person)ActiveRecord.find(Person.class, "name", "Mike");
Кроме того, вы можете сначала создать экземпляр типа записи, а затем выполнить поиск, чтобы заполнить его. Например,
Person person=new Person();
person.find("name", "Mike");
В этот момент у вас есть объект Person, и если вам нужно узнать его класс из функции в супертипе, вы просто делаете "this.getClass ()".
В качестве альтернативы, вы можете создать фиктивный объект Person для выполнения вызовов, просто чтобы вы могли выполнять getClass () при необходимости. Тогда ваша находка будет выглядеть примерно так:
Person dummyPerson=new Person();
Person realPerson=dummyPerson.find("name", "Mike");
Между прочим, мне кажется, что любая попытка иметь общий класс ActiveRecord будет означать, что возвращаемый тип поиска должен быть ActiveRecord, а не конкретный тип записи, поэтому вам, вероятно, придется привести его к правильный тип по возвращении из звонка. Единственный способ победить это - иметь явное переопределение поиска в каждом объекте записи.
У меня было много раз, когда я писал какой-то общий код обработки записей, но я всегда избегал создания объектов Java для каждого типа записи, потому что это неизменно превращается в написание целой пачки кода. Я предпочитаю просто сохранять объект Record полностью универсальным и иметь имена полей, индексы, какими бы ни были внутренние данные и имена. Если я хочу получить поле "foo" из записи "bar", мой интерфейс будет выглядеть примерно так:
Record bar=Record.get(key);
String foo=bar.get("foo");
Вместо:
BarRecord bar=BarRecord.get(key);
String foo=bar.getFoo();
Не так красиво и ограничивает проверку ошибок во время компиляции, но это намного меньше кода для реализации.