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

Java 使用静态导入时如何提示类型推断?,java,generics,type-inference,hamcrest,Java,Generics,Type Inference,Hamcrest,我在单元测试中使用junit和hamcrest,遇到了一个泛型问题: assertThat(collection, empty()); 我知道类型推断不能以这种方式使用,解决方案之一是提供类型提示,但在使用静态导入时如何键入提示?虽然类型推断没有我们希望的那么强大,但在这种情况下,真正出问题的是API。它毫无理由地不必要地自我限制。is empty matcher适用于任何集合,而不仅仅适用于特定E的集合 假设API是这样设计的 public class IsEmptyCollection

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


assertThat(collection, empty());

我知道类型推断不能以这种方式使用,解决方案之一是提供类型提示,但在使用静态导入时如何键入提示?

虽然类型推断没有我们希望的那么强大,但在这种情况下,真正出问题的是API。它毫无理由地不必要地自我限制。is empty matcher适用于任何集合,而不仅仅适用于特定
E
的集合

假设API是这样设计的

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

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

/**
 * 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();
        }
    };
}
/**
*如果提供的{@link Iterable}为空,则返回true的匹配器。
*/
公共静态匹配器>(){
@凌驾
公共无效说明(最终说明){
说明.附录文本(“空”);
}
@凌驾
公共布尔匹配安全性(最终可匹配项){
return item!=null&!item.iterator().hasNext();
}
};
}
我是这样用的:

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

这里的泛型没有问题。

我想你不能。Do
MyUtility.empty()
@rodion我想你是对的,我讨厌Java特性彼此不协调。顺便说一句,empty()方法是hamcrest matchers库的一部分(未包含在JUnit中)。这有点遗憾,不是吗。有时候,如果我需要多次使用像
empty()
这样的匹配器,我只需要创建一个绑定到特定类型的私有方法,比如
private static matcher empty(){return IsEmptyCollection.empty()}
。从长远来看,可以使您的测试更具可读性:)@rodion-将您的评论改写为答案。:)我使用的是hamcrest框架的一部分:@Gabriel,我明白了。我只知道与JUnit捆绑在一起的Hamcrest库,它不包括该类。我也知道,直到我发现自己经常使用org.JUnit.matchers.JUnitMatchers并自己编写简单和类似的matchers——我查看了Hamcrest,发现除了这个之外,它有很多不错的matchers。这种权衡与Collections.emptyList()类似吗java.util中的vs.Collections.EMPTY_列表?如果不是,为什么Collections.emptyList()使用具体的类型参数,而不是您建议的通配符?我们这里的empty()返回一个动词,我们希望它尽可能通用,以便它可以处理更多对象。emptyList()返回一个名词,它应该尽可能具体以满足调用方的需要。字符串的空列表与整数的空列表不同。“试着说服作者更改API”--事实上,已经存在这个问题:以及其他一些或多或少解决相同类型问题的问题。这里也有一些很好的补丁,让您了解如何编写自己版本的matchers。
List<String> list = new ArrayList<String>();
assertThat(list, isEmpty());