2009-10-02 16 views
15

मैं तीन जावा प्रकार है enum पर प्रतीक नहीं मिल सकता है जैसे कि नीचे परिभाषित:javac शिकायत: लागू करने इंटरफेस

Main.java:

import java.util.Arrays; 
import java.util.List; 

public class Main 
{ 
    private Object callFunction() 
    { 
     OperationDefinitions func = OperationDefinitions.CONCATENATE; 
     List<Object> values = Arrays.asList(new Object[] {"ABC", "-", "DEF"}); 
     return func.call (values); 
    } 

    public static void main (String[] args) 
    { 
     Main main = new Main(); 
     System.out.println (main.callFunction()); 
    } 
} 

Operation.java

import java.util.List; 

public interface Operation 
{ 
    abstract Object call(List<Object> params); 
} 

OperationDefinitions.java

import java.util.List; 

enum OperationDefinitions implements Operation 
{ 
    CONCATENATE() { 
     public Object call(List<Object> params) 
     { 
      StringBuilder builder = new StringBuilder(); 
      for (Object param : params) builder.append((String)param); 
      return builder.toString(); 
     } 
    }, 
    ; 

} 

(यह लगभग जावा 2 एड में दिया गया बिल्कुल सही उदाहरण है। मद 30) कोड ऊपर संकलित करता है तथा ग्रहण में ठीक चलाता है, लेकिन सूर्य javac के साथ मैं निम्नलिखित त्रुटि मिलती है: यदि मैं return ((Operation)func).call(values) को return func.call(values); से Main.java की लाइन 12 बदल यह ठीक संकलित

Main.java:12: cannot find symbol 
symbol : method call(java.util.List<java.lang.Object>) 
location: class OperationDefinitions 
     return func.call (values); 
         ^
1 error 

। इसके अलावा, अगर मैंने एक ही मुख्य वर्ग के तीन उप-वर्गों के रूप में तीन प्रकार (ऑपरेशन, मुख्य और ऑपरेशन परिभाषाएं) को एक साथ रखा है, तो यह ठीक से संकलित करता है।

तो मेरे पास मेरी समस्या के लिए कामकाज है, लेकिन मुझे आश्चर्य है, जैवैक को यहां एक कलाकार की आवश्यकता क्यों है, लेकिन ग्रहण नहीं करता है? क्या यह जावैक या ग्रहण में एक बग है?

मैं दोनों सूर्य javac 1.5.0_19 और 1.6.0_16

उत्तर

14

यह Bug 6522780 हो सकता है?
या Bug 6330385?
या Bug 6724345 - जेडीके 7 में तय - तो आप इसका परीक्षण कर सकते हैं।

+0

ऐसा लगता है कि यह वास्तव में बग 6724345 है। धन्यवाद! – amarillion

10

यह सूर्य की javac में एक बग हो सकता है की कोशिश की है। func एक enum है (भले ही enumOperation लागू करता है) और Enum कक्षा में कोई विधि call() नहीं है। इस मुद्दे को हल करने के लिए, मैं काम को बदलने के लिए सुझाव देते हैं:

Operation func = OperationDefinitions.CONCATENATE; 

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

+2

शैली के लिए +1, आमतौर पर यह करना सही काम होगा। जो मैंने यहां समझाया नहीं है वह यह है कि यह वास्तविक कोड का एक छोटा सा टुकड़ा है, और ऑपरेशन डिफिनिशन में अतिरिक्त सदस्य फ़ंक्शंस हैं जो ऑपरेशन में नहीं हैं, जैसे getHelp() और getDescription() – amarillion

+0

उल्लेख नहीं करना चाहिए कि हमें हमेशा प्रोग्राम करना चाहिए इंटरफेस कक्षाओं नहीं! getHelp और getDesctiption को किसी अन्य इंटरफ़ेस में परिभाषित किया जाना चाहिए। आइए मान लें कि आपके पास इंटरफेस हेल्पर {स्ट्रिंग getHelp() जैसे इंटरफ़ेस हैं; स्ट्रिंग getDescription();} तो आप getHelp() को निम्नानुसार आमंत्रित कर सकते हैं: सहायक सहायक = ऑपरेशनडिफिनिशन। कॉनकैनेट; helper.getHelp(); – uthomas

0

मुझे संदेह है कि यह वास्तव में javac में एक बग है; OperationDefinitions निश्चित रूप से में एक (सार) विधि कॉल (java.util.List) है, क्योंकि यह Operation इंटरफ़ेस लागू करता है। और वर्ग परिभाषा मान्य है, क्योंकि सभी स्थिरांक इस इंटरफ़ेस का ठोस कार्यान्वयन प्रदान करते हैं।

एक चीज जो इसके लिए आंशिक रूप से जिम्मेदार हो सकती है, यह है कि मेरे ज्ञान के लिए एक इंटरफ़ेस में परिभाषित सभी विधियां सार्वजनिक होनी चाहिए। यदि आपने डिफ़ॉल्ट एक्सेस संशोधक के साथ इंटरफ़ेस में call विधि को वास्तव में परिभाषित किया है, तो मैं संकलक से इसे अस्वीकार करने की अपेक्षा करता हूं - लेकिन यदि ऐसा नहीं होता है तो यह मुझे लाइन के नीचे समस्याओं को देखने के लिए आश्चर्यचकित नहीं करेगा। यदि यह एक टाइपो था तो ठीक है, लेकिन अगर ऐसा लगता है कि यह आपके कोड में सार्वजनिक रूप से घोषित करने की कोशिश कर रहा है और यह देख रहा है कि समस्या दूर हो गई है या नहीं।

+4

इंटरफ़ेस में सभी विधियां पूरी तरह से सार और सार्वजनिक हैं। यदि आप उन संशोधकों को छोड़ देते हैं (जो AFAIK अनुशंसित है), तो कंपाइलर उन्हें आपके लिए जोड़ देगा। यदि आप कोई अन्य संशोधक लिखते हैं, तो आपको त्रुटि मिल जाएगी। –

2

यह एक बग है, क्योंकि "स्टीफन डेन" ने हमें दिखाया है, लेकिन यदि आप एक नए संस्करण (लेकिन चाहिए) के लिए अद्यतन नहीं कर सकते हैं ...बस OperationDefinitions से inteface हटाने और enum पर विधि ...call(...) डाल, इस तरह:

public abstract Object call(List params);

काम करना चाहिए।

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