我有3种方法:
//1 -- check one item
public static <T> void containsAtLeast(String message,
T expectedItem,
Collection<? extends T> found) {
if (!found.contains(expectedItem))
Assert.fail("...");
}
//2 -- check several items
public static <T> void containsAtLeast(String message,
Collection<? extends T> expectedItems,
Collection<T> found) {
for (T exptetedItem : expectedItems)
containsAtLeast(message, exptetedItem, found);
}
//3 -- check several items, without message parameter
public static <T> void containsAtLeast(Collection<? extends T> expectedItems,
Collection<? extends T> found) {
containsAtLeast(null, expectedItems, found);
}
我希望方法//3
调用//2
但不会调用方法//1
。我的期望是否有错误?
*我使用sdk 1.7.0_25和Eclipse 4.3 *
答案 0 :(得分:12)
您的第二种方法希望通用类型expectedItems
(? extends T
)成为通用类型found
(T
)的子类型。
在第三种方法中,两种泛型类型之间没有子类型关系。他们都延伸T
,但可能是兄弟姐妹。
因此无法调用第二种方法。
示例:假设您使用这些类型调用第三个方法:
containsAtLeast(Collection<Integer> e, Collection<String> f)
因此,第三种方法中的T
为Object
。而且您的第一个方法也会使用T = Object
调用。