2015-05-21 25 views
18

यह जावा 7 के साथ ठीक संकलित करने के लिए लगता है, और स्काला पुस्तकालयों के किसी भी संस्करण:यह जावा 7 के तहत क्यों संकलित करता है लेकिन जावा 8 के तहत नहीं?

public static void main(String[] args) { 
    scala.collection.immutable.Set<String> set = new scala.collection.immutable.HashSet<String>(); 
    Iterator<String> iterator = set.iterator(); 
} 

यह भी जावा 8 और स्काला 2.11.5+ के साथ ठीक संकलित करता है। लेकिन जावा 8 और स्कैला 2.11.4 के साथ, ग्रहण शिकायत करता है:

The method iterator() is ambiguous for the type Set<String> 

मुझे यह समझ में नहीं आता है। आपको कुछ संदर्भों में चयन करने के लिए अधिभारित विधि पर अस्पष्टता मिल सकती है, लेकिन निश्चित रूप से नहीं कि आप कोई तर्क पारित नहीं कर रहे हैं?

public static void main(String[] args) { 
    Iterator<String> iterator = new scala.collection.immutable.HashSet<String>().iterator(); 
} 

तो शिकायत दूर चला जाता है:

वास्तव में अजीब बात यह है कि अगर मैं इसे इस तरह फिर से पात्र चयन है। ऐसा लगता है कि मुझे उपरोक्त संस्करण के बराबर बराबर होना चाहिए। तो अब यह ठीक क्यों संकलित होगा?

+0

जांच क्या स्काला 2.11 पर 'scala.collection.immutable.Set' के एपीआई में बदल निर्धारित किया गया है .4 और 2.11.5? यदि यह ओपनसोर्स –

+1

@WvdL कुछ भी नहीं बदला है। – mkrakhin

उत्तर

8

हम scala.collection.immutable.Set की javap उत्पादन की तुलना करें, हम 2.11.4 के लिए मिलता है:

public interface scala.collection.immutable.Set<A> 
    extends 
     scala.collection.immutable.Iterable<A>, 
     scala.collection.Set<A>, 
     scala.collection.generic.GenericSetTemplate<A, 
     scala.collection.immutable.Set>, 
     scala.collection.SetLike<A, scala.collection.immutable.Set<A>>, 
     scala.collection.Parallelizable<A, 
     scala.collection.parallel.immutable.ParSet<A>> { 
    public abstract scala.collection.generic.GenericCompanion<scala.collection.immutable.Set> companion(); 
    public abstract <B> scala.collection.immutable.Set<B> toSet(); 
    public abstract scala.collection.immutable.Set<A> seq(); 
    public abstract scala.collection.parallel.Combiner<A, scala.collection.parallel.immutable.ParSet<A>> parCombiner(); 
} 

और 2.11.5 के लिए:

public interface scala.collection.immutable.Set<A> 
    extends 
     scala.collection.immutable.Iterable<A>, 
     scala.collection.Set<A> { 
    public abstract scala.collection.generic.GenericCompanion<scala.collection.immutable.Set> companion(); 
    public abstract <B> scala.collection.immutable.Set<B> toSet(); 
    public abstract scala.collection.immutable.Set<A> seq(); 
    public abstract scala.collection.parallel.Combiner<A, scala.collection.parallel.immutable.ParSet<A>> parCombiner(); 
} 
यह कुछ हद तक ग्रहण 4.4 में इस मुद्दे की तरह लगता है

:

संस्करण 2.11.4 सही नहीं है, यह जावा वर्चुअल मशीन विशिष्टता का उल्लंघन, section 4.7.9.1 है

एक वर्ग हस्ताक्षर एन्कोड एक (संभवतः सामान्य) वर्ग घोषणा के बारे में जानकारी टाइप करता है। यह कक्षा के किसी भी प्रकार के पैरामीटर का वर्णन करता है, और इसकी सूची (संभवतः पैरामीटरकृत) प्रत्यक्ष सुपरक्लास और प्रत्यक्ष सुपरइंटरफेस, यदि कोई हो, तो सूचीबद्ध करता है। एक प्रकार पैरामीटर उसके नाम से वर्णित है, उसके बाद किसी भी वर्ग बाध्य और इंटरफेस सीमाओं के बाद।


यह स्पष्ट रूप से this scalac issue से समझाया गया है, जिसमें ... 2.11.5

+0

अच्छी जगह के साथ क्यों काम करता है! मुझे आश्चर्य है कि यह जावा 7 में क्यों नहीं है? शायद जावा 8 में इंटरफ़ेस विधियों के डिफ़ॉल्ट कार्यान्वयन के साथ कुछ करना है। इससे अस्पष्टता का संभावित स्रोत मिलता है जिसके साथ विधि लागू की जानी चाहिए। –

+1

मैंने जांच नहीं की है कि यह जावा 7 के साथ क्यों काम करता है। सभी कॉन्फ़िगरेशन (जावा [7,8] स्कैला-लाइब्रेरीज़-2.11 के साथ जैवैक संकलन। [4,5])। जावा 8 ग्रहण कंपाइलर कम अनुमोदित है। – gontard

5

यह सख्ती से जावा 8/स्कैला लाइब्रेरी समस्या नहीं हो सकता है। यह ग्रहण से संबंधित हो सकता है। ग्रहण का कौन सा संस्करण आप उपयोग कर रहे हैं? Java 8 generics thinks single method is ambiguous

+0

मैं 4.4.2 का उपयोग कर रहा हूँ। –

+0

यह अच्छी तरह से संबंधित हो सकता है। मुझे पूरा यकीन है कि यह पूरी कहानी नहीं है। कल, अनिवार्य रूप से एक ही चीज़ के साथ लेकिन एक अधिक जटिल संदर्भ में, इंटेलिजे ने इसे ठीक संकलित किया लेकिन मैवेन ने शिकायत की; आज, एक न्यूनतम उदाहरण बनाने की कोशिश कर रहा है, मैंने पाया है कि मेवेन इसे ठीक से संकलित करता है लेकिन ग्रहण शिकायत करता है। वीडर और वीडर। –

+3

यह समझाता नहीं है कि यह 2.11.5 – gontard

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