Хорошо, я знаю, что у вас не может быть абстрактного статического метода, хотя я считаю это ограничением лично.Я также знаю, что переопределение статических методов бесполезно, потому что, когда я имею дело с, скажем, MyList<T extends ObjectWithId>
и у моего объекта есть абстрактный класс со статическим методом, который переопределяется в его подклассах, T не существует во время выполнения, поэтому ObjectWithId
Статический метод будет вызываться вместо подкласса.
Итак, вот что у меня есть:
class PersistentList<T extends ObjectWithId> implements List<T>{
}
, где ObjectWithId
:
abstract ObjectWithId{
public abstract long getId();
}
Теперь проблемазаключается в том, что мой PersistentList предназначен для хранения на жестком диске, отсюда и название, и в действительности он будет хранить только идентификаторы объектов, которые он содержит.Теперь, когда я хочу реализовать
@Override
public T get(int index) {
}
метод PersistentList
, я хочу, чтобы моя программа использовала id
, который она хранила для index
, и вызывала статический метод objectForId(long id)
который будет реализован в каждом подклассе ObjectWithId
.Это не может быть метод экземпляра, потому что еще нет экземпляра, смысл в том, чтобы загрузить экземпляр с жесткого диска, используя id
.Так как это должно быть реализовано?Один из вариантов заключается в том, чтобы ObjectWithId
имел конструктор ObjectWithId(long id)
, реализованный в каждом подклассе, но T не существует во время выполнения, так как бы я его создал?Я знаю, что мог бы передать Class<T>
объект в конструкторе PersistentList
, но я бы предпочел, чтобы конструктор не имел никаких аргументов, но я не думаю, что есть способ получить класс T без явной передачи его вверно?
Надеюсь, это лучшее объяснение, извините за неоднозначный вопрос, с которого я начал.