(I slipped a change behind Christian's back that did this a while back, but it's since been undone. I'm copying and pasting most of my original email, even though hasContentsAnyOrder is no longer the method affected. Now it's about IterableSubject.iteratesOver and the various has() options from CollectionSubject.
@SuppressWarnings("unchecked") // varargs!
public void testCartesianProduct_unrelatedTypes() {
Set<Integer> x = set(1, 2);
Set<String> y = set("3", "4");
List<Object> exp1 = list((Object) 1, "3");
List<Object> exp2 = list((Object) 1, "4");
List<Object> exp3 = list((Object) 2, "3");
List<Object> exp4 = list((Object) 2, "4");
ASSERT.that(Sets.cartesianProduct(x, y)).hasContentsAnyOrder(exp1,
exp2, exp3, exp4);
}
com/google/common/collect/SetsTest.java:779:
hasContentsAnyOrder(java.util.List<java.lang.Object&java.io.Serializable&java.lang.Comparable<?
extends java.lang.Object&java.io.Serializable&java.lang.Comparable<?>>>...)
in org.junit.contrib.truth.subjects.IterableSubject<capture#106 of ?
extends org.junit.contrib.truth.subjects.CollectionSubject<?,java.util.List<java.lang.Object&java.io.Serializable&java.lang.Comparable<?
extends java.lang.Object&java.io.Serializable&java.lang.Comparable<?>>>,java.util.Collection<java.util.List<java.lang.Object&java.io.Serializable&java.lang.Comparable<?
extends java.lang.Object&java.io.Serializable&java.lang.Comparable<?>>>>>,java.util.List<java.lang.Object&java.io.Serializable&java.lang.Comparable<?
extends java.lang.Object&java.io.Serializable&java.lang.Comparable<?>>>,java.util.Collection<java.util.List<java.lang.Object&java.io.Serializable&java.lang.Comparable<?
extends java.lang.Object&java.io.Serializable&java.lang.Comparable<?>>>>>
cannot be applied to (java.util.List<java.lang.Object>,java.util.List<java.lang.Object>,java.util.List<java.lang.Object>,java.util.List<java.lang.Object>)
ASSERT.that(Sets.cartesianProduct(x, y)).hasContentsAnyOrder(exp1, exp2, exp3, exp4);
I'm sure that you're familiar with this general problem from Hamcrest, FEST, etc., so I can believe that you have a good reason to use the restrictive types, but my initial experience has been scary :)