2012-03-21 15 views
7

समारोह अमूर्त:जावा जेनरिक: कार्यात्मक की तरह अधिकतम()

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

max विधि कार्यान्वयन

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

और उपयोग (यह की तरह दिखना चाहिए कैसे)

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

लेकिन मैं यह त्रुटि प्राप्त करें और समझ में नहीं आता कि इसे 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 

मैंने बड़ी मात्रा में समान क्यूए पढ़ा है लेकिन इसे ठीक करने के तरीके को नहीं मिला है। धन्यवाद।

+1

FYI करें , आपका 'फंक्शन' प्रकार एक [इंटरफ़ेस] (http://docs.oracle.com/javase/tutorial/java/concepts/interface.html) का उपयोग करने के लिए एक अच्छी जगह जैसा दिखता है। – Taymon

+0

मैं तैयमन से सहमत हूं, मैं इसे एक अमूर्त वर्ग के बजाय एक इंटरफेस बनाउंगा। ध्यान दें कि [Google Guava] (http://code.google.com/p/guava-libraries/) में पहले से ही 'फ़ंक्शन' इंटरफ़ेस है जो बिल्कुल वही है। – Jesper

+0

@Taymon सुझाव के लिए धन्यवाद, लेकिन असल में मेरे पास इस वर्ग में और अधिक तरीके हैं। उदाहरण के लिए: सार्वजनिक समारोह तो (फंक्शन सेकंड) {...} –

उत्तर

13

जावा का एक बहुत ही सीमित प्रकार अनुमान है। आप इस बारे में हैं:

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

यह काफी परिष्कृत max() विधि, V के प्रकार के पैरामीटर अनुमान लगाने के लिए नहीं है, तो यह java.lang.Object बजाय लेता है। आप इस कोशिश कर सकते:

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

या, यदि आप एक पंक्ति में यह लिखना चाहते हैं, तो आप निम्नलिखित कर सकता है, यह सोचते हैं कि आपके max() विधि एक वर्ग Example नामित में परिभाषित किया गया है:

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

समझ गया, धन्यवाद! –

+0

अब मैं समझता हूं कि यह मेरी गलती नहीं थी, लेकिन जावा प्रकार अनुमान सीमाएं थीं। धन्यवाद ! –

संबंधित मुद्दे