मैं एक ऐसी विशेषता है जो (कुछ और जानकारी 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]
^
आप इस से बाहर किसी भी तरह से देख सकते हैं या यह सिर्फ उन मामलों में जहाँ "जावा जेनरिक का उपयोग करने में स्केला दर्द होता है" में से एक है है?
धन्यवाद। यह काम करता है। कोड अभी तक नहीं चल रहा है लेकिन आपका कोड और तुलनात्मक की प्रभावी घोषणा संकलन और ध्वनि संकलित करें। बहुत बहुत धन्यवाद। – Agl
मुझे पता है कि यह एक अलग सवाल है, लेकिन क्या एक अच्छा पेपर/ट्यूटोरियल/ब्लॉग कवर-बाउंड और वेरिएंट है? मैंने पहले ही इसके बारे में पढ़ा है लेकिन कोई तर्क दे सकता है कि मैंने उनसे बहुत कुछ नहीं सीखा;) (दूसरी तरफ, शायद यह सिर्फ मुझे है। इसलिए सभी उन्हें फिर से पढ़ते हैं) – Agl
यह एक बहुत अच्छा है (हालांकि यह ऊपर नहीं है आज तक - इसमें 2.8 फीचर्स के बारे में जानकारी नहीं है): http://programming-scala.labs.oreilly.com/ch12.html –