我目前正在尝试使用Java接口和泛型实现一个概念模型的API。该模型(Transmodel V5.0)详细描述了实体关系模型,但没有指定一些基本类型的使用。例如,各种实体的标识符类型或用于建立序列排序的类型未定义。
由于我希望尽可能保持API的通用性,因此我开始使用泛型来配置这些细节。我不想对类型做出任何假设,包括不假设任何东西是一致的。每个实体都可以具有不同的标识符类型,每个序列都可以使用不同的类型进行排序。
我面临的问题是,一旦一个实体引用另一个实体,复杂性就会迅速增加--我不仅需要传递其标识符类型,还需要传递配置引用实体所需的所有内容。
例如,我有:
/**
* @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();
}
在带有问号的位置,需要从CONF中提取VehicleJourney标识符的类型。如果这是可行的,那么复杂度应该保持在可管理的水平。