我目前正在尝试使用 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 标识符的类型。如果这可行,那么复杂性应该保持在可管理的水平。