Các khớp IsIterableContainingInAnyOrder
có hai quá tải đối với phương pháp nhà máy tĩnh containsInAnyOrder
(cả hai đều có kiểu trả về Matcher<java.lang.Iterable<? extends T>>
):quá tải xung đột với nhau cho hamcrest Matcher
containsInAnyOrder(java.util.Collection<Matcher<? super T>> itemMatchers)
containsInAnyOrder(Matcher<? super T>... itemMatchers)
Bây giờ xem xét sau đây chương trình:
import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
import static org.hamcrest.core.IsEqual.equalTo;
import static org.junit.Assert.assertThat;
import java.util.Arrays;
import org.junit.Test;
public class SomeTest {
@SuppressWarnings("unchecked")
@Test
public void foo() {
assertThat(Arrays.asList("foo","bar"),
containsInAnyOrder(equalTo("foo"), equalTo("bar")));
}
}
Khi thực hiện điều này như là một thử nghiệm JUnit, nó vượt qua, như mong đợi. Nó sử dụng quá tải thứ hai của containsInAnyOrder
được hiển thị ở trên.
Bây giờ, khi tôi thay đổi sự khẳng định này (mà chính xác phù hợp với ví dụ được đưa ra trong documentation of the first overload):
assertThat(Arrays.asList("foo","bar"),
containsInAnyOrder(Arrays.asList(equalTo("foo"), equalTo("bar"))));
^^^^^^^^^^^^^^
nó không biên dịch nữa, vì bây giờ các trình biên dịch suy luận kiểu trả về của containsInAnyOrder
để là
Matcher<Iterable<? extends List<Matcher<String>>>>
Dường như trình biên dịch vẫn chọn quá tải thứ hai. Nếu nó được sử dụng đầu tiên, ví dụ sẽ hoạt động. Tại sao nó cư xử như thế này? Làm thế nào tôi có thể thực hiện công việc này?
Tôi đang sử dụng Hamcrest 1.3 và Oracle Java 1.7.
Tôi khuyên bạn nên phiên bản thứ hai cho loại an toàn.Ngoài ra bạn có thể viết 'Matchers. containsInAnyOrder' thay vì 'IsIterableContainingInAnyOrder. containsInAnyOrder'. –
eee