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

2 番目の方法では、( ) のジェネリック型が ( expectedItems)? extends Tのジェネリック型のサブタイプであると想定しています。foundT

3 番目の方法では、2 つのジェネリック型の間にサブタイプの関係はありません。それらは両方とも拡張Tされますが、たとえば兄弟である可能性があります。

したがって、2 番目のメソッドを呼び出すことはできません。

例: これらの型で 3 番目のメソッドを呼び出すとします。

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

したがって、T3番目の方法はObjectです。そして、最初のメソッドも呼び出されT = Objectます。

于 2013-08-07T12:49:32.030 に答える