Generics Hell - 我如何将joda.DateTime传递给Hamcrest Matcher.greaterThan?

Dun*_*gor 13 java generics hamcrest jodatime

JodaTime有

public final class DateTime extends BaseDateTime {...}
Run Code Online (Sandbox Code Playgroud)

这是最直接的

public interface ReadableInstant extends Comparable<ReadableInstant>
Run Code Online (Sandbox Code Playgroud)

哈姆克雷斯特

public static <T extends java.lang.Comparable<T>> org.hamcrest.Matcher<? super T>
    greaterThan(T value) {...}
Run Code Online (Sandbox Code Playgroud)

如果我试试

greaterThan(new DateTime());
Run Code Online (Sandbox Code Playgroud)

然后我得到一个编译错误(Eclipse提供了最多的线索)

类型为Matchers的泛型方法greaterThan(T)不适用于参数(DateTime).推断类型DateTime不是有界参数的有效替代>

我是否正确地认为签名本greaterThan应该是

public static <T extends java.lang.Comparable<? super T>> org.hamcrest.Matcher<? super T>     
    greaterThan(T value)
Run Code Online (Sandbox Code Playgroud)

?是否有一种方法可以将这些组合在一起而不是原始的铸造Comparable

Jon*_*eet 16

是的,在我看来,这将是一个更好的签名.

您是否尝试过明确指定比较类型?

Matchers.<ReadableInstant>greaterThan(new DateTime());
Run Code Online (Sandbox Code Playgroud)

不幸的是,我不相信你可以使用静态导入调用它并且还指定类型参数 - 但这可能不会太困难.

当然另一种方法是抛出论点:

greaterThan((ReadableInstant) new DateTime());
Run Code Online (Sandbox Code Playgroud)

我没有Hamcrest方便,但上面使用你给我的签名测试类型对我来说很好.