我正在编写一个表示时间序列数据的类,即基本上是泛型类型(Instant, T)
的{{1}}对映射
T
我们处理的一些类实现了一个接口
interface TimeSeries<T> {
void add(Instant when, T data);
}
我希望在interface TimeStamped {
Instant getTimeStamp();
}
界面中提供一个更方便的方法来添加此类数据项,而无需说明时间。基本上,我想要
TimeSeries
but this seems not allowed by the language because I cannot use type variables in intersection types。是否存在不涉及放弃静态类型安全的解决方法?我能想到的唯一的事情是
interface TimeSeries<T> {
void add(Instant when, T data);
default <X extends T & TimeStamped> void add(X data) {
add(data.getTimeStamp(), data);
}
}
interface TimeSeries<T> {
void add(Instant when, T data);
default void add(TimeStamped data) {
add(data.getTimeStamp(), (T)data);
}
default void add(TimeStamped t, T data) {
add(t.getTimeStamp(), data);
}
}
类型安全,但仍然不方便。
答案 0 :(得分:1)
我想我理解你的问题。基本上,你可以使用TimeSeries
一些简单的类型来实现TimeStamped
,但是它的一些子类可以实现。{1}}。在这些情况下,甚至@assylias的解决方法都没有帮助。
好吧,我认为在Java 8中没有针对这个问题的干净解决方案,而且我没有使用Java 9的经验,但在阅读其新功能时我没有注意到这一点。这意味着你要么牺牲静态类型的安全性,要么安慰。
很难说什么是最好的解决方法。基本上我们到目前为止所拥有的是:
TimeStamped
接口的情况,如@assylias所建议。TimeStamped
接口的方法,而TimeSeries
作为参数。实际上比静止更好,但有点自下而上。我无法确定哪一个更适合您,因为我不了解您的使用案例。它们都不是完美的。我已经遇到过这个问题,我也没有找到超级智能解决方案。我无法做的另一件事是通用枚举。我的意思是,为什么不呢,如果可能的话会很有意思(但它也不是)。