2013-02-20 41 views
28

Tôi đang học về Generics Java và tôi tự hỏi mình câu hỏi này.Tuyên bố phương pháp chung của Java

Sự khác biệt giữa hai khai báo phương pháp này là gì?

public static void someMethod(List<? extends Number> numberList); 

public static <E extends Number> void someMethod(List<E> numberList); 
+7

bằng cách sử dụng thứ hai cho phép bạn tham chiếu E trong mã 'someMethod's của bạn. – Oren

Trả lời

19

Năm thứ hai bạn có một tham chiếu đến các loại trong phạm vi someMethod, cụ thể là E. Trong trước đây bạn không.

0

Sử dụng phương pháp khai báo đầu tiên sẽ không cho phép bạn thêm bất kỳ điều gì mới vào danh sách. Ví dụ, điều này sẽ không biên dịch.

public static void someMethod(List<? extends Number> numberList, Number number) { 
    numberList.add(number); 
} 

trong khi thứ hai cho phép bạn làm điều này:

public <T extends Number> static void someMethod(List<T> numberList, T number) { 
    numberList.add(number); 
} 
+0

Sử dụng thứ hai sẽ không. – ZeDonDino

+0

Bạn có thể thêm các phần tử vào danh sách, miễn là phần tử được thêm vào là loại E hoặc một lớp con. –

+0

Tôi đang sử dụng java SE 6 và không thể. – ZeDonDino

3

Với phiên bản thứ hai bạn có thể làm một cái gì đó như:

public static <E extends Number> void someMethod(List<E> numberList) { 
    E number = numberList.get(0); 
    numberList.add(number); 
} 

này là không thể với phiên bản đầu tiên.

9

Sự khác biệt chính là sau là phương pháp chung trước đây là không.

Vì vậy, ví dụ như trong các phương pháp sau bạn có thể làm một cái gì đó như thế này:

public static <E extends MyObject> void someMethod(List<E> someList) { 
    E myObject = someList.iterator().next(); // this can actually lead to errors 
    myObject.doSomething();     // so treat it as an example 
} 

Điều này có nghĩa rằng bạn có thể thay thế một kiểu bất kỳ E mà phù hợp với các quy tắc trong việc kê khai phương pháp chung chung và có thể sử dụng loại đó trong phương pháp của bạn.

Xin lưu ý rằng mặc dù bạn nên gọi phương thức chung với lập luận kiểu như thế này:

someClass.<MyArbitraryType>someMethod(someList); 

Bạn có thể tìm thấy một cái nhìn tổng quan tốt đẹp của phương pháp chung here.

+1

Trong java Se 7 và ở trên bạn có thể gọi đây là 'someClass.somemethod (someList); 'tôi tin, không có trình biên dịch se7 atm, vui lòng xác nhận? – ZeDonDino

+0

Cảm ơn bạn đã chỉ ra điều đó. –

+1

Tôi cũng không có trình biên dịch se7. –