2012-03-21 37 views
7

Chức năng trừu tượng:Java Generics: chức năng giống như max()

public abstract class Function<X, Y> {  
     abstract Y apply(X x);  
    } 

max phương pháp thực hiện

public static <V extends Comparable<V>> Function<List<V>, V> max() { 

    return new Function<List<V>, V>() { 
     @Override 
     public V apply(List<V> list) { 
      return Collections.max(list); 
     } 
    }; 
} 

Và sử dụng (làm thế nào nó sẽ giống như thế)

Date result = max().apply(datesList); 

Nhưng tôi gặp lỗi này và không hiểu tại sao yêu cầu phải có số Object

incompatible types; inferred type argument(s) java.lang.Object do not conform to bounds of type variable(s) V 
found : <V>project.Function<java.util.List<V>,V> 
required: java.lang.Object 

Tôi đã đọc số lượng lớn QA tương tự nhưng không hiểu cách sửa lỗi này. Cảm ơn.

+1

FYI , kiểu 'Hàm' của bạn trông giống như một nơi tốt để sử dụng [giao diện] (http://docs.oracle.com/javase/tutorial/java/concepts/interface.html). – Taymon

+0

Tôi đồng ý với Taymon, tôi sẽ làm cho giao diện đó thay vì một lớp trừu tượng. Lưu ý rằng [Google Guava] (http://code.google.com/p/guava-libraries/) đã có giao diện 'Function' giống hệt nhau. – Jesper

+0

@Taymon Cảm ơn bạn đã đề xuất, nhưng thực ra tôi có nhiều phương pháp hơn trong lớp học này. Ví dụ: công khai Chức năng rồi (Chức năng giây) {...} –

Trả lời

13

Java có suy luận kiểu rất hạn chế. Nếu bạn viết này:

Date result = max().apply(datesList); 

nó không phải là đủ tinh vi để suy ra các tham số kiểu của phương pháp max(), V, vì vậy nó cần java.lang.Object để thay thế. Bạn có thể thử này:

Function<List<Date>, Date> fn = max(); 
Date result = fn.apply(dates); 

Hoặc, nếu bạn muốn viết nó trong một dòng, bạn có thể làm những điều sau đây, giả định rằng phương pháp max() của bạn được định nghĩa trong một lớp có tên Example:

Date result = Example.<Date>max().apply(dates); 
+0

OK, cảm ơn! –

+0

Bây giờ tôi hiểu rằng đây không phải là lỗi của tôi, nhưng những hạn chế suy luận kiểu Java. Cảm ơn ! –

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