2015-06-19 35 views
6

Tôi có một chức năng tĩnh đối với ký sau cho một kiểu generic TSuy luận một kiểu generic từ một kiểu generic trong Java (biên dịch lỗi thời gian)

public static<T> List<T> sortMap(Map<T, Comparable> map) 

mà phải trả lại một danh sách các phím bản đồ với một số tài sản .

Bây giờ tôi muốn vượt qua một HashMap chung của loại S

Map<S,Double> map 

trong gọi hàm tĩnh trong một lớp học chung, trong đó có bản đồ như là một biến thành viên.

Tôi đã liệt kê một ví dụ mã tối thiểu bên dưới.

Tuy nhiên, tôi nhận được một thông báo lỗi (ST đều T nhưng trong phạm vi khác nhau của mã của tôi, ví dụ: T#1 = T, T#2 = S):

required: Map<T#1,Comparable> 
    found: Map<T#2,Double> 
    reason: cannot infer type-variable(s) T#1 
    (argument mismatch; Map<T#2,Double> cannot be converted to Map<T#1,Comparable>) 

Làm thế nào có thể giải quyết vấn đề này? Tôi ngạc nhiên rằng Java không cho phép suy ra một kiểu generic từ một kiểu generic. Cấu trúc nào trong Java có thể sử dụng để làm việc với kiểu lập luận mã trừu tượng hơn?

:

public class ExampleClass<T> { 
    Map<T, Double> map; 
    public ExampleClass() { 
     this.map = new HashMap(); 
    } 
    //the following line produces the mentioned error 
    List<T> sortedMapKeys = UtilityMethods.sortMap(map); 
} 

public class UtilityMethods { 
    public static<T> List<T> sortMap(Map<T, Comparable> map) { 
     // sort the map in some way and return the list 
    } 
} 
+0

Hãy thể hiện mã lớp khán giả. –

+0

'' static'' phương pháp không thể truy cập các biến thành viên; và bạn sử dụng phiên bản java nào? –

+0

Tôi nghĩ bạn sẽ phải thêm một số mã nữa để chúng tôi có thể hiểu được vấn đề. –

Trả lời

7

Đây không phải là vấn đề với các TS, nhưng với sự ComparableDouble.

Lý do lỗi là Map<T, Double> is not a Map<T, Comparable>.

Bạn sẽ phải mở rộng một chút phạm vi của tham số loại thứ hai. Một cái gì đó như:

public static <T, S extends Comparable<S>> List<T> function(Map<T, S> map) { 
    //implementation 
} 

Sau đó, bạn sẽ có thể gọi phương pháp này với:

Map<S, Double> map = new HashMap<S, Double>(); 
function(map); 
+0

điều này được gọi là [phương sai] (https://msdn.microsoft.com/en-US/library/ee207183.aspx) –

+0

Cảm ơn! Tôi đã bị lừa bởi thông điệp trình biên dịch tập trung vào các loại chung chung. Ngoài ra, tôi nghĩ rằng trình biên dịch sẽ hiểu rằng 'Double' là' Comparable' và các giao diện đó sẽ được xử lý khác với kế thừa lớp cho generics. Tôi vẫn nghĩ rằng logic Java của việc sử dụng từ khóa 'extends' trong Generics để mô tả rằng tôi mong đợi một kiểu' S'that * thực hiện * và giao diện là một chút. Tôi có bỏ sót điều gì ở đây không? Liệu nó có ý nghĩa với * mở rộng và giao diện * với generics? – madison54

+0

Có, 'extends' trong Generics được sử dụng cho cả hai lớp và giao diện. –

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