使用静态导入时如何提示类型推断?

时间:2011-07-30 15:25:40

标签: java generics type-inference hamcrest

我在单元测试中使用junit和hamcrest,我遇到了一个泛型问题:


assertThat(collection, empty());

我知道类型推断不可用,并且其中一个解决方案是提供类型提示,但是在使用静态导入时应该如何键入提示?

2 个答案:

答案 0 :(得分:3)

虽然类型推断没有我们想要的那么强大,但在这种情况下,它确实是错误的API。它没有任何理由不必要地限制自己。 is-empty matcher适用于任何集合,而不仅仅适用于特定E的集合。

假设API是以这种方式设计的

public class IsEmptyCollection implements Matcher<Collection<?>>
{
    public static Matcher<Collection<?>> empty()
    {
        return new IsEmptyCollection();
    }
}

然后assertThat(list, empty())按预期工作。

您可以尝试说服作者更改API。同时你可以有一个包装

@SuppressWarnings("unchecked")
public static Matcher<Collection<?>> my_empty()
{
    return (Matcher<Collection<?>>)IsEmptyCollection.empty();
}

答案 1 :(得分:0)

我不太明白这个问题。这是我使用的方法:

/**
 * A matcher that returns true if the supplied {@link Iterable} is empty.
 */
public static Matcher<Iterable<?>> isEmpty() {
    return new TypeSafeMatcher<Iterable<?>>() {

        @Override
        public void describeTo(final Description description) {
            description.appendText("empty");
        }

        @Override
        public boolean matchesSafely(final Iterable<?> item) {
            return item != null && !item.iterator().hasNext();
        }
    };
}

我这样使用它:

List<String> list = new ArrayList<String>();
assertThat(list, isEmpty());

这里的仿制药没问题。