13

JodaTime は

public final class DateTime extends BaseDateTime {...}

それはまでその方法を動作します

public interface ReadableInstant extends Comparable<ReadableInstant>

ハムクレストは

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

私が試したら

greaterThan(new DateTime());

次に、コンパイルエラーが発生します(Eclipseが最も手がかりを与えます)

タイプ Matchers のジェネリック メソッド greaterThan(T) は、引数 (DateTime) には適用されません。推定された型 DateTime は、境界付きパラメーターの有効な代替ではありません >

の署名はgreaterThan実際には

public static <T extends java.lang.Comparable<? super T>> org.hamcrest.Matcher<? super T>     
    greaterThan(T value)

? そして、生にキャストする以外にこれらを組み合わせる方法はありComparableますか?

4

2 に答える 2

16

はい、それはより良い署名になるように私には見えます。

比較タイプを明示的に指定しようとしましたか?

Matchers.<ReadableInstant>greaterThan(new DateTime());

残念ながら、静的インポートを使用して型引数を指定して呼び出すことができるとは思いませんが、それほど難しいことではないかもしれません。

もちろん、代わりに引数をキャストすることもできます。

greaterThan((ReadableInstant) new DateTime());

私はハムクレストを手元に持っていませんが、あなたが私に与えた署名をテストタイプで使用して、上記はうまくいきました。

于 2011-11-01T17:21:28.590 に答える
2

頻繁に使用し、変換が面倒な場合は、次のように独自の 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));

LocalDate の代わりに DateTime を使用する場合は、最初のリストで AbstractPartial を AbstractInstant に置き換えるだけです。

于 2013-12-13T20:22:22.437 に答える