2010-02-13 18 views
6

स्प्रिंग सुरक्षा के साथ विकास करते समय मैंने हाल ही में एक समस्या में भाग लिया है।असुरक्षित जावा इंटरफेस लागू करना

public interface GrantedAuthority extends Serializable, Comparable 

और जावा 1.5 के लिए और बाद में, इंटरफ़ेस Comparable एक प्रकार पैरामीटर T, जो वसंत सुरक्षा पुस्तकालयों में छोड़ दिया जाता है (जाहिर है, JVM 1.4 संगतता के लिए) ले जाता है: यह निम्नलिखित हस्ताक्षर के साथ एक अंतरफलक GrantedAuthority है।

तो मैं स्कैला में GrantedAuthority को लागू करने की कोशिश कर रहा हूं।

class Role extends GrantedAuthority { 
    . . . 
    def compareTo(obj: Any): Int = obj match { 
    case (r: Role) => r.toString.compareTo(this.toString) 
    case _ => -1 
    } 
} 

यह संकलन नहीं करता है:

error: class Role needs to be abstract, since method compareTo in trait Comparable of type (T)Int is not defined 

मैं कैसे स्काला में इस तरह के इंटरफ़ेस को लागू कर सकते हैं? जावा जेनेरिक्स साथ

+1

कच्चे प्रकार से संबंधित ध्वनि: https://lampsvn.epfl.ch/trac/scala/ticket/2970#comment:3 – retronym

+0

धन्यवाद, संक्षिप्त नाम। तो अंतिम जवाब वास्तव में, "wontfix" है? – incarnate

उत्तर

4

इंटरॉप समस्याओं दो प्रकार के होते (कम से कम):

  1. जावा कोड है कि तर्क टाइप को छोड़ देता है, अपने उदाहरण के रूप में, 'कच्चे प्रकार' की ओर जाता है। Comparable को अस्तित्व के प्रकार Comparable[_] के रूप में माना जाता है। कभी-कभी आप इस समस्या से अपना रास्ता निकाल सकते हैं। हालांकि, मुझे इस मामले में def compareTo(other: _) = ... लागू करने का कोई तरीका नहीं दिख रहा है।
  2. जावा जेनरिक में घोषणा साइट भिन्नता की धारणा नहीं है। Comparable[T] को एक contravariant scala विशेषता Ordering[-T] के साथ विस्तारित करने के लिए एक त्रुटि तब तक नहीं होगी जब तक कि आप @uncheckedVariance एनोटेशन का उपयोग न करें। (Discussion on the mailing list)

मेरा सुझाव है कि आप स्प्रिंग 3.x में अपग्रेड करने का प्रयास करें जो जावा 1.5 के विरुद्ध संकलित है। यदि यह संभव नहीं है, तो जावा में बेस क्लास BaseGrantedAuthority लिखें जो compareTo लागू करता है और स्काला में लागू किए जा सकने वाले टेम्पलेट विधि में प्रतिनिधि करता है।

+0

मुझे अपने विशेष मामले को हल करने के बजाय इस इंटरऑप समस्या में रूचि थी - आपने मुझे पूरी तरह से बिंदु दिखाया। धन्यवाद! – incarnate

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