2013-08-07 6 views
14

Tôi có 3 phương pháp:Generics vs Phương pháp quá tải

//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); 
} 

Tôi hy vọng rằng phương pháp //3 gọi //2 nhưng nó không, nó gọi phương thức //1. Có một sai lầm trong những gì tôi mong đợi?

* Tôi sử dụng sdk 1.7.0_25 và Eclipse 4.3 *

Trả lời

12

Phương pháp thứ hai của bạn hy vọng loại chung của expectedItems (? extends T) là một subtype của các loại chung của found (T).

Trong phương pháp thứ ba của bạn, không có mối quan hệ kiểu phụ giữa hai loại chung chung. Cả hai đều mở rộng T nhưng có thể là anh chị em chẳng hạn.

Vì vậy, phương pháp thứ hai không thể được gọi.

Ví dụ: hãy tưởng tượng bạn gọi phương thức thứ ba với các loại:

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

Vì vậy, các T trong phương pháp thứ ba của bạn là Object. Và phương pháp đầu tiên của bạn cũng được gọi với T = Object.

+0

Ngoài ra, 'T' là tham số kiểu phương thức cho mỗi trường hợp trong trường hợp này, vì vậy tất cả ba khai báo về cơ bản là độc lập với nhau. –

+0

Nhưng tại sao phương pháp đầu tiên được gọi là? Nếu 'T' trong' \\ 1' giống với 'Bộ sưu tập ' trong '\\ 3', thì' tìm thấy' trong '\\ 1' phải thuộc loại' Bộ sưu tập > 'trong' \\ 3'? Tôi đang ở đâu? –

+2

@assylias: Cảm ơn bạn: Tôi đã hoàn toàn bỏ qua chi tiết này. - Vì vậy, sau khi thêm '' cho 'tìm thấy' trong' // 2', nó bắt đầu hoạt động như mong đợi – Ralph