JodaTime has
public final class DateTime extends BaseDateTime {...}
一直到
public interface ReadableInstant extends Comparable<ReadableInstant>
Hamcrest
public static <T extends java.lang.Comparable<T>> org.hamcrest.Matcher<? super T>
greaterThan(T value) {...}
如果我尝试
greaterThan(new DateTime());
然后我得到一个编译错误(Eclipse给出了大多数线索)
匹配器类型的泛型方法greaterThan(T)不适用获取参数(DateTime)。推断的类型DateTime不是一个有效的替代对于有界参数>
我是否认为greaterThan
的签名实际上应该是
public static <T extends java.lang.Comparable<? super T>> org.hamcrest.Matcher<? super T>
greaterThan(T value)
?是否有一种方法可以将这些组合在一起,而不是将其转换为原始Comparable
?
是的,在我看来这将是一个更好的签名。
您是否尝试显式指定比较类型?
Matchers.<ReadableInstant>greaterThan(new DateTime());
我不相信您可以使用静态导入并指定类型参数来调用它,不幸的是——但这可能不会太困难。
当然,另一种方法是强制转换参数:
greaterThan((ReadableInstant) new DateTime());
我手边没有Hamcrest,但上面的工作对我来说很好,使用你给我的签名,在一个测试类型。
如果你经常使用它,并且被转换所困扰,你也可以像这样实现你自己的Matcher:
public static Matcher<AbstractPartial> isAfter(final AbstractPartial partial) {
return new BaseMatcher<AbstractPartial>(){
@Override
public void describeTo(final Description description) {
description.appendText("after partial: ").appendValue(partial);
}
@Override
public boolean matches(final Object object) {
if (object instanceof AbstractPartial) {
return ((LocalDate) object).isAfter(partial);
}
return false;
}
};
}
然后像这样测试:
Set<LocalDate> dates = Sets.newHashSet(new LocalDate(2013, 1, 1), new LocalDate(2013, 1, 2), new LocalDate(
2013, 1, 3));
assertThat(
CollectionUtils.isEqualCollection(filter(isAfter(new LocalDate(2013, 1, 1)), dates),
Lists.newArrayList(new LocalDate(2013, 1, 2), new LocalDate(2013, 1, 3))), is(true));
如果希望使用DateTime而不是LocalDate,只需将第一个清单中的AbstractPartial替换为AbstractInstant。