2014-09-03 11 views
15

मैं इन लोगों के लिए इसी तरह के दो कार्य किया है: यह स्पष्ट है कि वे नहीं संघर्ष और कहा कि कॉल नहीं अस्पष्ट हो सकता है कर सकते हैं मेरे लिएजावा 8 कार्यात्मक इंटरफ़ेस अस्पष्ट संदर्भ (यह एक बग है?)

public static <In extends Number, Out extends Number> Out test(In in, Function<In, Out> f) { 
    Out x = f.apply(in); 
    return test(in, x); 
} 

public static <In extends Number, Out extends Number> Out test(In in, Out out) { 
    return out; 
} 

(!) । हालांकि, जावा 8 का नवीनतम संस्करण के साथ, निम्नलिखित कॉल के विफल:

Test.test(2, Integer::new); 

Error:(17, 16) java: reference to test is ambiguous both method <In,Out>test(In,java.util.function.Function<In,Out>) in org.test and method <In,Out>test(In,Out) in org.test match साथ

जबकि

Test.test(2, new Function<Integer, Number>() { 
    @Override 
    public Number apply(Integer integer) { 
     return 10; 
    } 
}); 

और

Test.test(2, (Function<Integer, Number>) integer -> 10); 

काम करते हैं।

इस संकलक में एक बग है (या इस असफल चाहिए?) मेरी स्थापना के बारे में

अधिक जानकारी नीचे दी

जावा संस्करण:

Desktop $ java -version 
java version "1.8.0_05" 
Java(TM) SE Runtime Environment (build 1.8.0_05-b13) 
Java HotSpot(TM) 64-Bit Server VM (build 25.5-b02, mixed mode) 

त्रुटि:

Test.java:5: error: reference to test is ambiguous 
    Test.test(2, Integer::new); 
     ^
both method <In#1,Out#1>test(In#1,Function<In#1,Out#1>) in Test and method <In#2,Out#2>test(In#2,Out#2) in Test match 
where In#1,Out#1,In#2,Out#2 are type-variables: 
In#1 extends Number declared in method <In#1,Out#1>test(In#1,Function<In#1,Out#1>) 
Out#1 extends Number declared in method <In#1,Out#1>test(In#1,Function<In#1,Out#1>) 
In#2 extends Number declared in method <In#2,Out#2>test(In#2,Out#2) 
Out#2 extends Number declared in method <In#2,Out#2>test(In#2,Out#2) 

टेस्ट प्रोग्राम:

import java.util.function.Function; 

public class Test { 
    public static void main(String[] args) { 
    Test.test(2, Integer::new); 
    } 

    public static <In extends Number, Out extends Number> Out test(In in, Function<In, Out> f) { 
    Out x = f.apply(in); 
    return test(in, x); 
    } 

    public static <In extends Number, Out extends Number> Out test(In in, Out out) { 
    return out; 
    } 
} 

के बाद से इस मुद्दे को दूसरों के द्वारा की पुष्टि की है, मैं इसे ओरेकल के लिए एक बग के रूप में रिपोर्ट की है।

+0

'test.test (2, (फंक्शन <इंटीजर, इंटीजर>) इंटीजर :: नया) 'मेरे लिए काम करता है। आपका रास्ता भी मेरे लिए विफल रहता है ('जावा-वर्जन' मुझे '1.8.0' देता है)। – ajb

+0

ग्रहण में काम करता है। –

उत्तर

4

Test.test(2, Integer::new); विफल नहीं होना चाहिए। वास्तव में, यह मेरे लिए विफल रहता है। चल रहा है:

C:\Users\David>java -version 
java version "1.8.0_20" 
Java(TM) SE Runtime Environment (build 1.8.0_20-b26) 
Java HotSpot(TM) 64-Bit Server VM (build 25.20-b23, mixed mode) 
C:\Users\David>javac -version 
javac 1.8.0_20 

जो मैं बता सकता हूं, यह सबसे हालिया है। आप किस मंच पर काम कर रहे हैं?

जैसा कि यह पता चला है, यह ओएसएक्स (और विंडोज़ पर नहीं) पर एक बग है। अगर किसी के पास * NIX बॉक्स है, तो उन्हें ओपी के कोड का भी परीक्षण करना चाहिए।

+0

धन्यवाद! ऐसा प्रतीत होता है कि मुझे ओएसएक्स पर 'javac 1.8.0_05' इंस्टॉल किया गया है। (अधिक जानकारी के साथ मेरा प्रश्न अपडेट किया गया) – isakkarlsson

+0

@isakkarlsson: निश्चित रूप से निश्चित रूप से एक बग होना चाहिए। शुक्र है, जावैक का सबसे हालिया संस्करण (1.8.0_20) इसे ठीक करता है। –

+1

शायद विंडोज़ पर। मैंने अभी 'javac -version' को अपडेट किया है:' javac 1.8.0_20'। त्रुटि बनी रहती है। – isakkarlsson

1

मैं एक ही समस्या है, लेकिन मैं यह करने की कोशिश की: इस javac (डेबियन खरखरा + jdk1.8.0_20x64) में विफल रहता है जबकि

Test.test(2, Function.identity()); // OK 
Test.test(2, val -> 2L); // FAIL 
Test.test(2, Function.<Integer>identity().andThen(a -> a * 2)); // OK 
Test.<Integer,Long>test(2, val -> 2L); // OK 
Test.test(2, (final Integer a) -> a* 2); // FAIL 

, यह ग्रहण में ठीक काम करता है।

एक तरफ नोट पर, मुझे लगता है कि यह उन प्रकार की अनुमान समस्याओं में से एक है। आपको शायद एक बग रिपोर्ट भरनी चाहिए।

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