2014-06-10 4 views
6

मेरे पास एक स्कैला क्लास है जो जावा इंटरफ़ेस को कार्यान्वित करने का प्रयास कर रही है (इकाई परीक्षण उद्देश्यों के लिए जावाई 7 में एंटीटीमेनगर विशिष्ट होने के लिए)।एकाधिक परिवर्तनीय पैरामीटर विधियों के साथ स्कैला में जावा इंटरफ़ेस को कैसे कार्यान्वित करें (इरेज़र समस्या टाइप करें)?

public StoredProcedureQuery createStoredProcedureQuery(String procedureName, Class... resultClasses); 
public StoredProcedureQuery createStoredProcedureQuery(String procedureName, String... resultSetMappings); 

स्काला कार्यान्वयन में मेरे पास है: इंटरफ़ेस इन दोनों तरीकों (दूसरों के बीच) है

override def createStoredProcedureQuery(procedureName: String, resultClasses: Class[_]*): StoredProcedureQuery = ??? 
override def createStoredProcedureQuery(procedureName: String, resultSetMappings: String*): StoredProcedureQuery = ??? 

हालांकि, मैं निम्नलिखित त्रुटि मिलती है:

MyTest.scala:134: error: double definition: 
method createStoredProcedureQuery:(procedureName: String, resultSetMappings: String*)javax.persistence.StoredProcedureQuery and 
method createStoredProcedureQuery:(procedureName: String, resultClasses: Class[_]*)javax.persistence.StoredProcedureQuery at line 133 
have same type after erasure: (procedureName: String, resultSetMappings: Seq)javax.persistence.StoredProcedureQuery 
override def createStoredProcedureQuery(procedureName: String, resultSetMappings: String*): StoredProcedureQuery = ??? 

मुझे नहीं है चारों ओर एक काम के साथ आने में सक्षम हो गया। मेरी Google खोज भी ढूंढने और जवाब देने में विफल रही। मैं स्कैला 2.10.4 का उपयोग कर रहा हूँ।

उत्तर

2

AFAIK EntityManager जावा इंटरफ़ेस सीधे स्कैला में लागू नहीं किया जा सकता है। पहली विधि में जावा varargs को Seq[Class[_]] और दूसरी विधि में Seq[String] में परिवर्तित कर दिया गया है। मिटाने के कारण, दोनों विधियों को उसी हस्ताक्षर createStoredProcedureQuery(String, Seq[_]) के रूप में दिखाई देता है।

मैं केवल इस मुद्दे के लिए एक समाधान का प्रस्ताव दे सकता हूं। आप एक जावा सार वर्ग कि EntityManager इंटरफ़ेस फैली लिख सकते हैं और आदेश को स्पष्ट करने के लिए अलग-अलग नामों के साथ 2 अन्य अमूर्त तरीकों को सौंपने से 2 हमलावर तरीकों को लागू करना चाहिए:

public abstract class EntityManagerWorkaround implements EntityManager { 
@Override 
public StoredProcedureQuery createStoredProcedureQuery(String procedureName, Class... resultClasses) { 
    return createStoredProcedureQueryForResultClasses(procedureName, resultClasses); 
} 

@Override 
public StoredProcedureQuery createStoredProcedureQuery(String procedureName, String... resultSetMappings) { 
    return createStoredProcedureQueryForResultSetMappings(procedureName, resultSetMappings); 
} 

public abstract StoredProcedureQuery createStoredProcedureQueryForResultClasses(String procedureName, Class... resultClasses); 

public abstract StoredProcedureQuery createStoredProcedureQueryForResultSetMappings(String procedureName, String... resultSetMappings); 

}

अब आप विस्तार कर सकते हैं स्कैला से अमूर्त वर्ग और असंबद्ध विधियों को लागू करें:

class EntityManagerImpl extends EntityManagerWorkaround { 
    override def createStoredProcedureQueryForResultClasses(procedureName: String, resultClasses: Class[_]*) = ??? 

    override def createStoredProcedureQueryForResultSetMappings(procedureName: String, resultSetMappings: String*) = ??? 
} 
+0

धन्यवाद। यह काम किया। क्या इसका मतलब है कि भाषा में "छेद" है। यदि स्कैला जावा के साथ इंटरफेस करने के लिए है, तो ऐसा लगता है कि इसे जावा varargs (बेहतर स्कैला varargs के अलावा) का समर्थन करना चाहिए। – Integrator

+0

समस्या प्रति var varss के साथ नहीं है, लेकिन varargs और विधि अधिभार के बीच बातचीत। अस्पष्टताओं को हल करने के लिए जावा में जटिल नियम हैं, संकलक पर हार्डकोड किए गए हैं। मेरी समझ यह है कि स्कैला डिजाइनरों ने फैसला किया कि स्कैला कंपाइलर में इन नियमों को दोबारा बनाने के बजाय उनके पास बेहतर चीजें थीं ... तो हाँ, स्कैला में कुछ हिस्सों हैं जहां जावा के साथ अंतःक्रियाशील नहीं है और हमें अभी भी काम पर जावा पर वापस आने की जरूरत है इन सीमाओं के आसपास। – Jelmo

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

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