2014-10-31 24 views
5

मैं निम्नलिखित इंटरफेस है:अनुमान कर जेनरिक - जावा

public interface Evaluator<T> { 
    T evaluate(Collection<Extractable> sample); 
} 

और एक वर्ग है कि इंटरफ़ेस को लागू करने:

public class PrecisionEvaluator implements Evaluator<Map<Triple<Short, Integer, String>, AttributePrecisionBean>> { 

@Override 
public Map<Triple<Short, Integer, String>, AttributePrecisionBean> evaluate(Collection<Extractable> sample){ 
    ... 

}

तो के उपयोग से ऊपर होगा:

Evaluator<Map<Triple<Short, Integer, String>, AttributePrecisionBean>> eval = new PrecisionEvaluator(); 

वें है इंटरफ़ेस बनाने के लिए एक तरीका है मूल्यांकनकर्ता इसे लागू करने वाले वर्ग में परिभाषित जेनेरिक प्रकार को पूरी तरह से वापस कर देता है? ताकि उपयोग बस होगा:

Evaluator eval = new PrecisionEvaluator(); 

या इसके बारे में जाने के लिए एक क्लीनर तरीका है?

+0

मुझे लगता है कि आपके पास असली समस्या यह है कि आपने 'मैप <ट्रिपल <शॉर्ट, इंटीजर, स्ट्रिंग>, विशेषताप्रिजनबीन>' इसका अपना नाम और इसलिए अपनी कक्षा नहीं दी है। – SpaceTrucker

उत्तर

0

मेरे ज्ञान के लिए, Evaluator प्रकार का एक वस्तु कच्चे प्रकार का होगा, जब तक आप सामान्य प्रकार निर्दिष्ट नहीं करते। क्या आप जावा 7 के बाद से कर सकते हैं सामान्य उदाहरण निर्माण के लिए प्रकार निष्कर्ष है (हालांकि यह शायद इस मामले में मदद नहीं करेगा): स्काला जानने के लिए, अपने वाक्यविन्यास है:

Evaluator<Map<Triple<Short, Integer, String>, AttributePrecisionBean>> eval 
    = new Evaluator<>(); 
0

हाँ वहाँ यह करने के लिए एक रास्ता है जावा के मुकाबले कहीं अधिक सरल, अन्य कारणों से, कंपाइलर प्रकार अनुमान।

अधिक गंभीरता से, आप जावा के साथ बेहतर नहीं कर सकते हैं, अगर आप Evaluator अकेले उपयोग करते हैं तो इसे Evaluator<Object> के रूप में संकलित किया जा रहा है, जो आपको प्रकार की सुरक्षा और बहुरूपता रखने की अनुमति नहीं देगा। आप यहां कुछ भी कम करने के लिए कक्षा class CustomTriple extends Triple<Short,Integer,String>> बना सकते हैं।

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