2012-07-30 12 views
7

लागू नहीं कर सकते मैं स्केला (2.9.2) में जेनरिक का उपयोग करता है एक जावा विधि लागू करने के लिए करना चाहते हैं। लेकिन मैं नाकाम रहने हूँ ...स्काला, जेनेरिक जावा विधि

जावा इंटरफ़ेस विधि:

public <T extends Number> void setAttribute(Key<T> key, Number value); 

स्काला कोड है कि विधि लागू करना चाहते हैं:

def setAttribute[T <: Number](key: Key[T], value: Number) = { 
    setAttributeLocal(key, value) } 

private def setAttributeLocal[T](key: Key[T], value: T) = { 
    val stringValue = ConvertUtils.convert(value, classOf[String]).asInstanceOf[String] 
    session = session + (key.getValue() -> stringValue) 
} 

कुंजी की तरह दिखता है:

public class Key<T> 

लेकिन यह संकलित नहीं करता है।

[error] found : mypackage.Key[T] 
[error] required: mypackage.Key[java.lang.Number] 
[error] Note: T <: java.lang.Number, but Java-defined class Key is invariant in type T. 
[error] You may wish to investigate a wildcard type such as `_ <: java.lang.Number`. (SLS 3.2.10) 
[error]  setAttributeLocal(key, value) 

मुझे पता नहीं है कि समस्या क्या है। कोई सुझाव/विचार?

greez GarfieldKlon

+1

हमें यह जानना होगा कि 'कुंजी' कैसा दिखता है। क्योंकि अगर मैं उपरोक्त कोड को ठीक से संकलित करता हूं तो 'सार्वजनिक इंटरफ़ेस कुंजी ' का उपयोग करता हूं। –

+0

@ गारफील्डकॉन किस स्केल के साथ काम कर रहे हैं? –

+0

@ 0__ किस संस्करण के तहत यह संकलित करता है? –

उत्तर

4

ऐसा प्रतीत होता है संकलक setAttributeLocal करने के लिए अपने कॉल से नाखुश है। setAttributeLocal एक Key[Number] की आवश्यकता है, लेकिन आप एक Key[_ <: T] प्रदान कर रहे हैं। जावा-भूमि में इसका मतलब है आप एक Key<Number> के रूप में एक Key<? extends Number> पारित करने के लिए कोशिश कर रहे हैं।

सुझाव setAttributeLocalKey<? extends Number> या Key[_ <: Number] स्वीकार करते हैं, चाहे वह जावा या स्काला परिभाषित किया गया है के आधार पर है।

+0

@GarfieldKlon मैं इस कई बार पढ़ने के लिए था ... मुझे लगता है कि बेन का सुझाव दे रहा है कि अगर आप फिक्सिंग पर ध्यान केंद्रित कर रहे हैं 'setAttribute' तो आप गलत बात पर विचार करना हो सकता है। आपके द्वारा वर्णित त्रुटि 'setLocalAttribute' के साथ एक प्रकार की समस्या है, न कि' setAttribute'। 'SetLocalAttribute' की आपकी परिभाषा कैसी दिखती है? –

+0

@Richard - ठीक बताते हैं, यही कारण है कि मैं इस –

+0

पुन: पेश नहीं कर सका हम अंत में इस समाधान कहा: 'निजी डीईएफ़ setAttributeLocal [टी] (कुंजी: कुंजी [टी], मूल्य: वस्तु)' – GarfieldKlon

1

कुछ यहाँ थोड़ा दूर लग रहा है।

आप की कोशिश की है:

def setAttribute[T <: Number](key: Key[T], value: T) = 
    setAttributeLocal(key, value) 

यह अजीब/कुंजी के लिए प्रकार टी संरक्षित करने के लिए बुरा लगता है, लेकिन मूल्य पर इसका इस्तेमाल नहीं। मेरा अनुमान है कि वह जगह है जहां आपको एक परिवर्तनीय त्रुटि मिल रही है। आप प्रकार T की कुंजी पर टाइप करने का प्रयास कर रहे हैं और संकलक सुनिश्चित नहीं है कि T के लिए Number पास नहीं हो सकता है (जबकि यह जानता है कि के लिए यह T पास कर सकता है)।

हम और अधिक कोड देख सकते हैं?

+0

एक विकल्प नहीं है यही कारण है, क्योंकि यह एक ओवरराइड नहीं है। – GarfieldKlon

+0

जावा और स्काला के प्रकार के इंटरफेस में सीमाओं रहे हैं। क्या आप जावा में कर रहे हैं प्रकार अस्वस्थ है, और इसलिए स्काला इसे अस्वीकार करती। आपको लगता है कि टाइप wizardry उपयोग करने के लिए जारी रखना चाहते हैं, तो आप जावा के प्रकार प्रणाली के साथ रहना, खेद होगा। – jsuereth

1

रूप @jsuereth पहले ही बताया, setAttribute और setAttributeLocal, अर्थात् के हस्ताक्षर में अंतर है, जबकि बाद है कि पूर्व एक Key[T <: Number] स्वीकार करता है लेकिन मूल्य है कि एक Number वास्तव में करने के लिए महत्वपूर्ण के साथ चला जाता हो ठीक करता है, अधिक लचीला और कुंजी और मान T <: Number होने की अनुमति देता है। यह अजीब लगता है और आप उस निर्णय पर पुनर्विचार करना चाहेंगे। यह @ बेन शूलज़ द्वारा समझाई गई समस्या का भी कारण बनता है।

किसी भी मामले में, संकलक (2.9।

MyI.java:

public interface MyI { 
    public <T extends Number> void setAttribute(Key<T> key, Number value); 
} 

Key.java:

public interface Key<T> { 
} 

Test.scala:

object Test extends App { 
    def setAttribute[T <: Number](key: Key[T], value: Number) = { 
    setAttributeLocal(key, value) } 

    private def setAttributeLocal[T](key: Key[T], value: Number) = { 
    /* Notice that value is now also of type Number. */ 
    } 
} 
) निम्नलिखित सेटअप के साथ खुश है