के साथ जेनेरिक रिटर्न टाइप को कवर करना मैं जावा 8 में कुछ उच्च-ऑर्डर-फ़ंक्शंस में लैम्ब्डा अभिव्यक्ति के रिटर्न प्रकार से जेनेरिक प्रकार की जानकारी को संरक्षित करने की कोशिश कर रहा हूं। मैंने इस वास्तविक परीक्षण को मेरे परीक्षण को सरल बना दिया है मामला। समस्या यह नहीं है कि मैं कोड को बिल्कुल ठीक करने की अपेक्षा करता हूं, लेकिन मुझे अपेक्षाकृत सामान्य प्रकार (0) R
java.lang.String
के रूप में अनुमानित करने की अपेक्षा करता है और फ़ंक्शन कॉल के माध्यम से किया जाता है।जावा 8 - लैम्बडास
import java.util.function.Function;
public class AdamTest {
public final static void main(final String args[]) {
final AdamTest adamTest = new AdamTest();
final String s = adamTest.thing2(7).apply(i -> i.toString());
System.out.println(s);
}
private <R> R fn1(final Function<Integer, R> op) {
return op.apply(10);
}
private <R> Function<Function<Integer, R>, R> thing2(final Integer val) {
return fn1(i -> new Function<Function<Integer, R>, R>() {
@Override
public R apply(Function<Integer, R> op) {
return op.apply(val * i);
}
}
);
}
}
फिलहाल यह कोड final String s = adamTest.thing2(7).apply(i -> i.toString());
इस लाइन के कारण संकलित नहीं होता है। मुझे लगता है कि मेरे पास मेरे प्रकार की सीमाओं के साथ कुछ गड़बड़ है, क्योंकि संकलक thing2(7).apply
के रिटर्न प्रकार का अनुमान लगाने में सक्षम नहीं लगता है और String
की बजाय Object
की रिपोर्ट करता है, जिसे मैं उम्मीद कर रहा था।
मैं कैसे सामान्य प्रकार सीमा सही मिलता है ताकि सही वापसी प्रकार अर्थात java.lang.String
मान लिया जाता है संकलक द्वारा?
क्या आप जो त्रुटि प्राप्त कर रहे हैं उसे जोड़ सकते हैं? –
संकलक बाएं से दाएं अभिव्यक्ति का मूल्यांकन करता है; समस्या 'adamTest.thing2 (7)' पर होती है। कंपाइलर प्रकार को समझने के लिए '.apply' को नहीं देखता है, और इसके बिना यह संभव नहीं है। –
आप वास्तव में क्या करने की कोशिश कर रहे हैं? यह पूरी तरह से अस्पष्ट है। – fge