2011-11-13 11 views
26

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

मूल जावा

public abstract class Base { 
    ... 
    protected abstract Foo getFoo(); 
} 

जो स्काला

तक बढ़ा दिया गया

public class Fred extends Base { 
    ... 
    protected Foo getFoo() { 
     return foo; 
    } 
} 

अब जब मैं बंदरगाह बेस था

class Base { 
    ... 
    protected def getFoo(): Foo 
} 

संकलक शिकायत है कि

, विरासत में मिला विधि की दृश्यता को कम नहीं कर सकते ...


अब मैं समझता हूँ कि क्योंकि अपने नियमों में आसानी से अलग हैं, स्काला संकलक बजाय बाईटकोड में दृश्यता लागू करने के लिए जाता है ताकि getFoo है javap'd कक्षा में जनता को चिह्नित किया। लेकिन

protected[packagename] def getFoo() 

अभी भी एक पुक्का (जावा) संरक्षित विधि उत्पन्न नहीं करता है, हालांकि मुझे लगता है कि दृश्यता एक जैसी होनी चाहिए।

वहाँ स्काला संकलक को मनाने के लिए एक विधि है कि जावा संरक्षित करने पर विचार होगा फेंकना कोई तरीका है?

+0

मैं एक आधिकारिक 'नहीं' –

+0

बहुत बढ़िया सवाल को स्वीकार करेंगे। इस पृष्ठ तक पहुंचने से पहले मैंने उसी मार्ग का पालन किया। – ebruchez

उत्तर

2

आप दो जावा कार्यान्वयन के बीच सैंडविच स्काला, आप एक जावा सुपर क्लास कि केवल वांछित सार संरक्षित तरीकों है, कम से कम जब तक आप स्काला के सभी उपवर्गों परिवर्तित (यदि यह वास्तव में के तहत कोड है बना सकते हैं कर सकते हैं अपने नियंत्रण)। लेकिन मुझे उम्मीद है कि एक बेहतर तरीका है ...

EDIT: एक और विकल्प annotation processing tool जैसे किसी प्रकार के बाइटकोड रीइटर का उपयोग करना है।

+3

यह एक घृणास्पद योजना है, लेकिन मैंने देखा सबसे अच्छा! दरअसल उप-वर्ग मेरे नियंत्रण में हैं, इसलिए मैं केवल getFoo के कार्यान्वयन को सार्वजनिक रूप से बदल सकता हूं, लेकिन यह एक दिलचस्प सवाल प्रतीत होता है। –

+0

@DuncanMcGregor: हाँ, मुझे पता है। एक और विकल्प जोड़ा गया ... –

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

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