14

我有 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*

4

1 回答 1

12

您的第二种方法期望 ( ) 的泛型类型是( expectedItems)? extends T的泛型类型的子类型。foundT

在您的第三种方法中,两个泛型类型之间没有子类型关系。例如,它们都扩展T但可能是兄弟姐妹。

所以不能调用第二种方法。

示例:假设您使用这些类型调用第三种方法:

containsAtLeast(Collection<Integer> e, Collection<String> f)

所以T你的第三种方法是Object. 你的第一个方法也被调用T = Object了。

于 2013-08-07T12:49:32.030 回答