泛型与方法重载

时间:2013-08-07 12:44:24

标签: java generics

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

1 个答案:

答案 0 :(得分:12)

您的第二种方法希望通用类型expectedItems? extends T)成为通用类型foundT)的子类型。

在第三种方法中,两种泛型类型之间没有子类型关系。他们都延伸T,但可能是兄弟姐妹。

因此无法调用第二种方法。

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

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

因此,第三种方法中的TObject。而且您的第一个方法也会使用T = Object调用。