В настоящее время я пытаюсь реализовать API для концептуальной модели с использованием интерфейсов Java и дженериков. Модель (Transmodel V5.0) подробно описывается как модель отношения сущности, но она не указывает некоторые используемые базовые типы. Например, типы идентификаторов для разных объектов или типы, используемые для установления порядка в последовательностях, не определены.
Поскольку я хочу, чтобы API как можно более общий, я начал использовать generics для настройки этих деталей. Я не хочу делать какие-либо предположения о типах, в том числе не предполагая, что что-либо согласовано. Каждый объект может иметь различный тип идентификатора, каждая последовательность может иметь другой тип, используемый для целей заказа.
Проблема, с которой я сталкиваюсь, заключается в том, что сложность растет быстрее, когда один объект ссылается на другой - мне не только нужно передавать типы для его идентификатора, но и все, что необходимо для настройки ссылочного объекта.
Например, у меня есть:
/**
* @param <ID> The type for the identifier of this entity.
* @param <ID_JP> The type identifying journey patterns.
* @param <OP_JP> The ordering used for points in journey patterns.
* @param <JP> The type of journey pattern referenced by this entity.
*/
public interface VehicleJourney<
ID,
ID_JP, OP_JP extends Comparable<OP_JP>, JP extends JourneyPattern<ID_JP, OP_JP>
> extends IdentifiableObject<ID>
{
JP getJourneyPattern();
}
Я все еще могу прочитать это и понять, но он становится более чем многословным. И тогда такие объекты, как VehicleJourney, могут ссылаться на другие объекты, что приводит к взрыву списка параметров типа. Это почти самый маленький нетривиальный пример, о котором я могу думать.
Есть ли способ создать единый объект Java, который моделирует всю конфигурацию системы типов? Я думаю о том, что будет иметь все типы идентификаторов и типы упорядочения, и затем может быть передан как один, превратив пример выше в нечто вроде этого:
public interface VehicleJourney<CONF, JP extends JourneyPattern<CONF>>
extends IdentifiableObject<???>
{
JP getJourneyPattern();
}
В месте с вопросительными знаками тип идентификатора VehicleJourney должен каким-то образом быть извлечен из CONF. Если это будет осуществимо, то сложность должна оставаться на управляемом уровне.