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

发布于 2024-11-27 00:37:50 字数 163 浏览 2 评论 0原文

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


assertThat(collection, empty());

我知道这种方式无法进行类型推断,解决方案之一是提供类型提示,但是在使用时我应该如何键入提示静态导入?

I am using junit with hamcrest in my unit tests and I came across a generics problem:


assertThat(collection, empty());

I am aware of type inference not being available this way and that one of the solutions is to give a type hint, but how should I type hint when using static imports?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

も星光 2024-12-04 00:37:50

虽然类型推断并不像我们希望的那么强大,但在这种情况下,实际上是 API 出了问题。它无缘无故地限制自己。 is-empty 匹配器适用于任何集合,而不仅仅是特定 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();
}

While type inference is not as powerful as we would like, in this case, it's really the API that's at fault. It unnecessarily restricts itself for no good reason. The is-empty matcher works on any collection, not just on collections of a specific E.

Suppose the API is designed this way

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

then assertThat(list, empty()) works as expected.

You can try to convince the author to change the API. Meanwhile you can have a wrapper

@SuppressWarnings("unchecked")
public static Matcher<Collection<?>> my_empty()
{
    return (Matcher<Collection<?>>)IsEmptyCollection.empty();
}
过气美图社 2024-12-04 00:37:50

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

/**
 * 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());

这里泛型没有问题。

I don't quite understand the problem. Here's the method I use:

/**
 * 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();
        }
    };
}

And I use it like this:

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

No problem with generics here.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文