इस उदाहरण पर विचार करें:लैम्बडा से कौन सा कार्यात्मक इंटरफ़ेस बनाने का निर्णय लेता है?
import java.util.function.Consumer;
public class Example {
public static void main(String[] args) {
Example example = new Example();
example.setConsumer(test -> System.out.println("passed string is " + test)); //uses MyConsumer, why ?
example.getConsumer().accept("Test 1");
example.setConsumer((MyConsumer<String>)test -> System.out.println("passed string is " + test)); //uses MyConsumer
example.getConsumer().accept("Test 2");
example.setConsumer((Consumer<String>)test -> System.out.println("passed string is " + test)); //uses Consumer
example.getConsumer().accept("Test 3");
}
private Consumer<String> consumer;
public Consumer<String> getConsumer() {
return consumer;
}
public void setConsumer(Consumer<String> consumer) {
this.consumer = consumer;
}
public void setConsumer(MyConsumer<String> consumer) {
this.consumer = consumer;
}
@FunctionalInterface
public interface MyConsumer<T> extends Consumer<T> {
@Override
default void accept(T value) {
System.out.println("In consumer string: " + value); //example thing to do
receive(value);
}
void receive(T value);
}
}
क्या मुझे यहाँ दिलचस्पी पहला परीक्षण है। यह उपभोक्ता के बजाय MyConsumer का उपयोग क्यों कर रहा है? क्या होगा यदि मेरे पास एक ही लैम्ब्डा संरचना के साथ अधिक अलग संभावित उपभोक्ता थे, जिनकी प्राथमिकता है? इसके अलावा, टेस्ट 2 पर जो कलाकार मैं करता हूं उसे मेरे आईडीई द्वारा Redundant
के रूप में चिह्नित किया जाता है। इसका मतलब है कि lamdba पहले MyConsumer के रूप में बनाया गया है। ऐसा क्यों ?
मैं जैवैक के साथ इंटेलिजे आइडिया का उपयोग कर रहा हूं।
मुझे नहीं पता कि आप किस आईडीई का उपयोग कर रहे हैं। मुझे लगता है कि यह जेवीएम है, ऑब्जेक्ट के रनटाइम प्रकार का उपयोग करके, जो "निर्णय लेता है"। – duffymo
मुझे लगता है कि जावा सबसे विशिष्ट प्रकार चुनता है, जो इस मामले में 'MyConsumer' है। यदि 'मायकंस्यूमर'' उपभोक्ता 'का उपनिवेश नहीं था, तो मुझे लगता है कि आपको एक त्रुटि मिली होगी कि यह एक महत्वाकांक्षी कॉल है। – marstran
यह सबसे विशिष्ट विधि चुनता है। यदि आपके पास उदाहरण के लिए 'MyConsumer2 उपभोक्ता 'और' सेट कॉन्स्यूमर (MyConsumer2 उपभोक्ता) बढ़ाता है, तो पहला कॉल संदिग्ध होगा और आपके पास संकलन समय त्रुटि होगी। यह भी देखें [जेएलएस 15.12.2.5] (https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.12.2.5)। –