2010-09-15 11 views
12

मैं एक ऐसी विशेषता है जो (कुछ और जानकारी this related question by myself में पाया जा सकता है, हालांकि मुझे नहीं लगता कि, यह इस सवाल के लिए आवश्यक है)covariant Typeparameter जावा इंटरफ़ेस

trait Extractor[-A,+B] { 
    def extract(d:A):B 
    //lots of other things 
} 
इस तरह दिखता है मिल गया है में अपरिवर्तनीय करने की आवश्यकता है

एक मौजूदा जावा ढांचे में इस का उपयोग करने के लिए मैं इस Extractor चाहते हैं या तो एक समारोह है कि रिटर्न के लिए एक Comparator[B] (किया जा रहा java.util.Comparator) या और भी बेहतर Comparator[A] का विस्तार। अब यह एक समस्या है क्योंकि Comparator एस प्रकार पैरामीटर आविष्कार होना चाहिए, जबकि A contravariant है और B कॉन्वर्सेंट है।

तो मैं इस तरह त्रुटियों मिलती है:

scala> import java.util.Comparator 
import java.util.Comparator 

scala> trait Extractor[-A,+B] extends Comparator[A] 
<console>:6: error: contravariant type A occurs in invariant position in type [-A,+B]java.lang.Object with java.util.Comparator[A] of trait Extractor 
     trait Extractor[-A,+B] extends Comparator[A] 
      ^


scala> trait Extractor[-A, +B] {     
    | def comp:Comparator[B] 
    | } 
<console>:7: error: covariant type B occurs in invariant position in type => java.util.Comparator[B] of method comp 
     def comp:Comparator[B] 
      ^

आप इस से बाहर किसी भी तरह से देख सकते हैं या यह सिर्फ उन मामलों में जहाँ "जावा जेनरिक का उपयोग करने में स्केला दर्द होता है" में से एक है है?

उत्तर

12

प्रकार-सीमा की मदद से यह निम्न करने के लिए संभव है:

scala> trait Extractor[-A, +B] { 
    | def comp:Comparator[_ <: B] 
    | } 
defined trait Extractor 
+0

धन्यवाद। यह काम करता है। कोड अभी तक नहीं चल रहा है लेकिन आपका कोड और तुलनात्मक की प्रभावी घोषणा संकलन और ध्वनि संकलित करें। बहुत बहुत धन्यवाद। – Agl

+0

मुझे पता है कि यह एक अलग सवाल है, लेकिन क्या एक अच्छा पेपर/ट्यूटोरियल/ब्लॉग कवर-बाउंड और वेरिएंट है? मैंने पहले ही इसके बारे में पढ़ा है लेकिन कोई तर्क दे सकता है कि मैंने उनसे बहुत कुछ नहीं सीखा;) (दूसरी तरफ, शायद यह सिर्फ मुझे है। इसलिए सभी उन्हें फिर से पढ़ते हैं) – Agl

+2

यह एक बहुत अच्छा है (हालांकि यह ऊपर नहीं है आज तक - इसमें 2.8 फीचर्स के बारे में जानकारी नहीं है): http://programming-scala.labs.oreilly.com/ch12.html –

7

आप Extractor[A,B]@uncheckedVariance एनोटेशन का उपयोग करके Comparator[A] का विस्तार कर सकते हैं। क्योंकि Comparator सकता Comparator[-T] के रूप में परिभाषित किया गया है

scala> import scala.annotation.unchecked.uncheckedVariance 
import scala.annotation.unchecked.uncheckedVariance 

scala> trait Extractor[-A,+B] extends java.util.Comparator[A @uncheckedVariance] 
defined trait Extractor 

@uncheckedVariance यहाँ सुरक्षित है। इस एनोटेशन का उपयोग करते हुए स्कैला 2.8 के लिए Ordering कॉन्वर्सेंट बनाने के आसपास discussion था।

संपादित अधिक के बारे में @uncheckedVariance के लिए this question देखें।

+0

ओह यह भी एक अच्छा है। असल में यह संस्करण हो सकता है जो मेरे कोड में समाप्त होता है। । । जैसे ही मुझे आपके द्वारा पोस्ट किए गए थ्रेड को पढ़ने का समय मिलता है। आपका बहुत बहुत धन्यवाद! – Agl

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