2015-06-13 18 views
7

मैं निम्नलिखित वर्गजावा 8: लैम्ब्डा समारोह और जेनेरिक वाइल्डकार्ड

class Book implement Borrowable { 
    @Override 
    public String toString(Function<? extends Borrowable 
          , String> format) { 
      return format.apply(this);  
    } 
} 

यह मैं एक त्रुटि है कि मैं उपयोग नहीं कर सकते "लागू" इस (पुस्तक वस्तु) पर देता है।

मेरे वर्तमान फ़ॉर्मेटर

Function<Book, String> REGULAR_FORMAT = book -> "name='" + book.name + '\'' + 
     ", author='" + book.author + '\'' + 
     ", year=" + book.year; 

है मैं के रूप में मैं अभी बुक के सदस्यों के लिए उपयोग खो देगा नहीं प्रकार

Function<Borrowable, String> 

की लैम्ब्डा समारोह बनाने के लिए नहीं करना चाहते हैं उधार लेने से उजागर

उत्तर

7

Function<? extends Borrowable, String> प्रकार का अर्थ है कि कुछ प्रकार स्वीकार करने में सक्षम है जो Borrowable फैलाता है। इसका मतलब यह नहीं है कि यह Book स्वीकार करता है। शायद सबसे अच्छा समाधान Borrowable के लिए सामान्य पैरामीटर लागू करने के लिए है:

public interface Borrowable<T> { 
    public String toString(Function<? super T, String> format); 
} 

और Book में यह निर्दिष्ट करें:

public class Book implements Borrowable<Book> { 
    @Override 
    public String toString(Function<? super Book, String> format) { 
     return format.apply(this); 
    } 
} 

यह कैसे काम करता है Comparable इंटरफ़ेस के समान है।

+0

यह काम किया। भले ही मैं समझ नहीं पा रहा हूं कि आपका समाधान कैसा है। एक लिंक या छोटे से अधिक अंतर्दृष्टि बहुत उपयोगी – AbrahamDaniel

2

आप Function<? super Book, String> की तलाश में हो सकता है।

Function<Book, String> मान्य Function<? extends Borrowable, String> है, लेकिन यह Function<DVD, String> है। आपका विधि (toString) हो सकता है एक Function<DVD, String> साथ कहा जा है, जो आप चाहते हैं क्योंकि this एक DVD नहीं है this पारित नहीं कर सकते हैं!

, शायद Function<? super Book, String> को तर्क प्रकार बदलें।

+0

टिप्पणी है कि यह अधिरोहित है हो सकता है, तो यह वास्तव में 'Borrowable' इंटरफ़ेस में परिभाषित किया है। –

+0

@TagirValeev यह कार्य करना चाहिए, क्योंकि 'फंक्शन '' फंक्शन <का उप-प्रकार है? सुपर बुक, स्ट्रिंग> '(और हाँ, मुझे लगता है कि यह सही तरीका है, मुझे लगता है) – immibis

+1

यह काम नहीं करता है। आप अलग-अलग तर्क प्रकार निर्दिष्ट करते हुए उपप्रकार में विधि को ओवरराइड नहीं कर सकते हैं, भले ही वे संगत हों। केवल वापसी प्रकार और घोषित अपवादों को संकुचित किया जा सकता है। –

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