Generics Hell - Как передать joda.DateTime в Hamcrest Matcher.greaterThan? - PullRequest
13 голосов
/ 01 ноября 2011

JodaTime имеет

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 дает наибольшую подсказку)

Универсальный метод greatThan (T) типа Matchers не применим для аргументов (DateTime).Предполагаемый тип DateTime не является допустимой заменой ограниченного параметра>

Правильно ли я считаю, что подпись greaterThan должна действительно быть

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

?И есть ли способ соединить их вместе, за исключением приведения к сырому Comparable?

Ответы [ 2 ]

16 голосов
/ 01 ноября 2011

Да, мне кажется, это была бы лучшая подпись.

Вы пытались указать тип сравнения явно?

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

Не думаю, что вы можете вызвать егоиспользуя статический импорт, а также указав аргумент типа, к сожалению, но это может быть не так уж сложно.

Конечно, альтернативой является приведение аргумента:

greaterThan((ReadableInstant) new DateTime());

НадеюсьУ меня не было под рукой Hamcrest, но все вышесказанное отлично работало для меня, используя подпись, которую вы мне дали, в тестовом типе.

2 голосов
/ 14 декабря 2013

Если вы часто используете его и беспокоитесь о преобразовании, вы также можете реализовать свой собственный 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;
        }
    };
}

И протестировать его так:Вы хотите использовать DateTime вместо LocalDate, просто замените AbstractPartial на AbstractInstant в первом листинге.

...