在与客户交谈时,我经常听到一个常见的误解,即所有关于泛型类型的信息都会从您的 Java 类文件中擦除。这完全是错误的。所有静态泛型信息都将保留,只有单个实例的泛型信息会被擦除。因此,如果我有一个实现List<String>的Foo类,那么我可以在运行时确定Foo实现了由String参数化的 List 接口。但是,如果我在运行时实例化一个ArrayList<String>的实例,则我无法获取该实例并确定其具体的类型参数(我可以确定ArrayList需要类型参数)。在本篇文章中,我将向您展示一些可用泛型元数据的实际用法,这些用法简化了策略接口和实现的创建,这些接口和实现因其处理的对象类型而异。
我在许多应用程序中看到的一种模式是使用某种策略接口,其具体实现分别处理特定的输入类型。例如,考虑投资银行领域的一个简单场景。任何公开交易的公司都可以发行公司行为,这些行为会对其股票带来实际变化。一个关键的例子是股息支付,它向所有股东每股支付一定数量的现金、股票或财产。在投资银行中,接收这些事件的通知并计算由此产生的权利对于保持交易账簿与正确的股票和现金价值同步至关重要。
作为对此的具体示例,考虑一下持有 1,200,000 股 IBM 股票的大银行 BigBank。IBM 决定发放每股 0.02 美元的股息。因此,BigBank 需要收到股息行为的通知,并在适当的时间更新其交易账簿以反映额外可用的 24,000 美元现金。
权利的计算将根据执行的企业行为类型而有很大差异。例如,兼并很可能导致一家公司的股票减少,而另一家公司的股票增加。
如果我们考虑一下这在 Java 应用程序中的外观,我们可以假设会看到类似这样的(高度简化)示例
public class CorporateActionEventProcessor {
public void onCorporateActionEvent(CorporateActionEvent event) {
// do we have any stock for this security?
// if so calculate our entitlements
}
}
有关事件的通知可能通过来自外部方的多种机制传入,然后发送到此CorporateActionEventProcessor类。CorporateActionEvent接口可以通过许多具体的类来实现
public class DividendCorporateActionEvent implements CorporateActionEvent {
private PayoutType payoutType;
private BigDecimal ratioPerShare;
// ...
}
public class MergerCorporateActionEvent implements CorporateActionEvent {
private String currentIsin; // security we currently hold
private String newIsin; // security we get
private BigDecimal…