@Test public void testWildcards() throws Exception { CallbackCollector<Object> callback = new CallbackCollector<>(); Callback<String> strCallback = transform(callback, Functions.toStringFunction()); strCallback.call("foo"); strCallback.call("bar"); Function<Super, Class<?>> superFunction = new Function<Super, Class<?>>() { @Override @Nullable public Class<?> apply(@Nullable Super input) { return input.getClass(); } }; Callback<Super> superCallback = transform(callback, superFunction); Callback<Sub> subCallback = transform(callback, superFunction); superCallback.call(new Super()); superCallback.call(new Sub()); subCallback.call(new Sub()); assertEquals(Lists.newArrayList("foo", "bar", Super.class, Sub.class, Sub.class), callback.getItems()); }