2011-12-06 41 views

Trả lời

7

Không nhiều.

Mặt khác, hãy xem xét phương pháp này:

public <T extends A> T transform(T t); 

Và mã gọi:

class B implements A { ... } 
B result = transform(new B(...)); 

Nó sẽ không được tốt (trên sẽ không biên dịch, như trình biên dịch sẽ buộc bạn phải khai báo result loại là A) bạn đã khai báo phương thức là

public A transform(A a) 
+0

Điều này cũng đúng nếu bạn có loại trả về. –

+0

"bạn đã khai báo f là", 'f' có nghĩa là gì? – Freewind

+0

@Freewind cảm ơn bạn, đã sửa lỗi đánh máy. –

8

Không có sự khác biệt khi sử dụng một đối tượng. Nhưng hãy tưởng tượng nếu bạn có

class B extends A { ... } 

public void f(List<A> list) { ... }; 

public <T extends A> void f(List<T> list) { ... }; 

với người đầu tiên bạn có thể vượt qua một danh sách đó là chính xác loại List<A>. Với thứ hai, bạn có thể chuyển danh sách chứa các đối tượng mở rộng A. Tuy nhiên, với cái đầu tiên bạn không thể làm điều tương tự. Vì vậy, nói cách khác bạn không thể vượt qua List<B> cho phương pháp đầu tiên nhưng bạn có thể đến phương pháp thứ hai.

+1

đối với trường hợp thứ hai bạn vẫn có thể viết 'public void f (danh sách danh sách);' – newacct

+0

Có thể. Tôi đã chỉ hiển thị một ví dụ mặc dù. –

4

Không có sự khác biệt trong trường hợp của bạn vì tham số kiểu chỉ được sử dụng ở một nơi. Cả hai phương pháp này sẽ chấp nhận bất cứ điều gì đó là một A hoặc kéo dài A. Phương pháp chung sẽ có ý nghĩa hơn trong trường hợp này vì tham số kiểu cho phép bạn buộc giá trị trả về để tham số truyền vào:

public <T extends A> T f(Class<T>) {...} 
0

Cho dù nó làm cho một sự khác biệt phụ thuộc vào những gì bên trong chức năng đó.

Điểm của generics là đảm bảo an toàn loại. Giả sử A có hai lớp con, hãy gọi chúng là B và C. Trong ví dụ đầu tiên, sử dụng f (Danh sách < A>), danh sách có thể bao gồm B, C hoặc hỗn hợp cả hai. Nhưng trong ví dụ thứ hai, f < T mở rộng A> (Danh sách < T>), khi chúng ta gọi hàm, chúng ta phải xác định loại. Nếu chúng ta nói f < B>, thì chúng ta biết đây là danh sách các B, không cho phép C. Chúng tôi sẽ không được phép chuyển vào danh sách C hoặc A chung, chúng tôi không thể thêm bất kỳ C nào vào danh sách và bất kỳ thứ gì chúng tôi đưa ra sẽ được đảm bảo là B.

Cho dù điều này là tốt hay xấu tùy thuộc vào những gì bạn đang cố gắng làm. Nếu ý tưởng là bạn muốn một danh sách hoặc là tất cả B hoặc tất cả C, thì thông tin chung sẽ giúp đảm bảo điều này. Nếu bạn muốn một danh sách có thể là một kết hợp của hai, sau đó bạn không muốn sử dụng chung chung, sử dụng đơn giản f (Danh sách < A>).

+0

bạn đang đề cập đến ví dụ nào? – newacct

+0

Bởi "ví dụ" tôi có nghĩa là hai tờ khai chức năng áp phích ban đầu đã cho: " f (Danh sách )" và "f (Danh sách )". Được rồi, có thể họ không thực sự là "ví dụ". – Jay

+0

Tôi không thấy điều đó trong câu hỏi; chỉ trong một trong những câu trả lời – newacct

Các vấn đề liên quan