जावा में ओवरराइड समकक्ष हस्ताक्षर, जावा भाषा विशिष्टता में इस स्थिति तक संकलित-समय त्रुटियां क्यों सीमित हैं?

जावा भाषा विशिष्टता (जावा एसई 7 संस्करण सटीक होना) निम्नलिखित बताता है :

यह कक्षा में ओवरराइड-समकक्ष हस्ताक्षर के साथ दो विधियों की घोषणा करने के लिए एक संकलित-समय त्रुटि है।

विनिर्देश यह नहीं बताता है कि यह निम्नलिखित परिभाषाओं के संदर्भ में वही हस्ताक्षर के साथ दो विधियों की घोषणा करने के लिए एक संकलित-समय त्रुटि है:

यदि उनके पास समान नाम और तर्क प्रकार हैं तो दो तरीकों का एक ही हस्ताक्षर होता है।

इसलिए, इसके साथ, निम्न वर्ग को तब तक संकलित नहीं करना चाहिए जब तक कि मैं कह सकता हूं कि दो गेटर्स ओवरराइड-समकक्ष नहीं हैं:

public class Foo {

private String value = null;

public Foo(String value) {
    this.value = value;
}

String getValue() {
    System.out.println("String version");
    return value;
}

int getValue() {
    System.out.println("int version");
    return Integer.parseInt(value);
}

public static void main(String[] args) {
    Foo foo = new Foo("5");
    System.out.println(foo.getValue());
    System.out.println(foo.getValue() + 5);
}

}

मेरा सवाल यह है, क्या यह जावा भाषा विशिष्टता में एक निरीक्षण नहीं है? निश्चित रूप से कक्षा फू संकलन नहीं करना चाहिए?

मेरा आईडीई शिकायत करता है, लेकिन मेरा कंपाइलर नहीं करता है। इसके अतिरिक्त, जब मुख्य विधि चलती है, तो ऑर्डर जिसमें गेटर्स घोषित किए जाते हैं, आउटपुट बदलते हैं।

अद्यतन

जैसा कि यह पता चला है, मेरी .class फ़ाइलें जहां जावा के लिए ग्रहण कंपाइलर द्वारा उत्पादित किया गया है। मुझे नहीं पता था कि यह संकलन त्रुटियों के चेहरे में भी .class फ़ाइलों का उत्पादन कर सकता है और इसलिए परेशान था।

1
नवीनतम एसडीके (जेडीके 7u45) के साथ संकलित नहीं है
जोड़ा लेखक Drop, स्रोत
@ निको आप किस प्लेटफॉर्म का उपयोग करते हैं?
जोड़ा लेखक Drop, स्रोत
जैसा कि यह पता चला है, जावा के लिए ग्रहण कंपाइलर कक्षा फ़ाइल का उत्पादन कर रहा था।
जोड़ा लेखक Nico de Wet, स्रोत
मुझे एक "डुप्लिकेट विधि" संकलन त्रुटि मिलती है।
जोड़ा लेखक Elliott Frisch, स्रोत
मैंने इसे 6u45, 7u7, 7u45, और 8b118 के साथ करने की कोशिश की, और वही "त्रुटि: विधि getValue() पहले से ही परिभाषित है" हर मामले में। यह एक अल्पकालिक बग हो सकता है जो 7u11 में भाग गया हो, या आपके पर्यावरण में कुछ गड़बड़ हो।
जोड़ा लेखक Stuart Marks, स्रोत

4 उत्तर

मुझे यह जेडीके 7u45 (विंडोज़ x64) के साथ मिलता है:

foo.java:14: error: method getValue() is already defined in class Foo
int getValue() {
    ^
1 error

शायद आप नवीनतम चश्मे और पुराने कंपाइलर संस्करण की तुलना कर रहे हैं।

या तो अपने कंपाइलर को अपडेट करें या पुरानी चश्मा खोजें;)

Ideone: link

आशा करता हूँ की ये काम करेगा।

0
जोड़ा

आपको प्रदान किए गए लिंक पर आपको पढ़ना चाहिए:

  1. Two methods have the same signature if they have the same name and argument types.
  2. The signature of a method m1 is a subsignature of the signature of a method m2 if either:
    1. m2 has the same signature as m1, or
    2. the signature of m1 is the same as the erasure (§4.6) of the signature of m2.

Two method signatures m1 and m2 are override-equivalent iff either m1 is a subsignature of m2 or m2 is a subsignature of m1.

It is a compile-time error to declare two methods with override-equivalent signatures in a class.

इसलिए, यदि दो तरीकों में एक ही हस्ताक्षर है (जिसका रिटर्न प्रकार के साथ कुछ लेना देना नहीं है), तो उनके हस्ताक्षर एक दूसरे के उपनिवेश हैं। इससे उन्हें ओवरराइड-समकक्ष बनाता है, जो एक संकलन त्रुटि उत्पन्न करता है।

आपके मामले में, getValue विधियों में एक ही हस्ताक्षर होते हैं, जो उन्हें ओवरराइड-समकक्ष बनाता है, जो वर्ग को अवैध बनाता है। किसी भी उचित जावा संकलक को उस तरह के कोड संकलित नहीं करना चाहिए।

0
जोड़ा

प्रस्तुत कक्षा को जावा भाषा विशिष्टता के संदर्भ में संकलित नहीं किया जाना चाहिए, और यह उदाहरण के लिए Windowsx64 पर नवीनतम जेडीकेयू 45 के साथ संकलित नहीं है क्योंकि इस वर्ग में दो विधियों वाले प्रश्न में बताया गया है कि एक ही हस्ताक्षर में संकलन-समय होता है त्रुटि।

हालांकि कक्षा को जावा भाषा विशिष्टता के संदर्भ में संकलित नहीं किया जाना चाहिए, इसका मतलब यह नहीं है कि आपको कक्षा संकलन नहीं दिखाई देगा। ऐसा इसलिए है क्योंकि उदाहरण के लिए जावा के लिए ग्रहण कंपाइलर संकलन त्रुटियों के सामने .class फ़ाइलों का उत्पादन करता है और प्रदान की गई उदाहरण कक्षा के साथ यह प्रोग्राम को संकलित और चलाएगा।

0
जोड़ा

यह संकलन नहीं करना चाहिए। वापसी मूल्य प्रकार तर्कों में से एक नहीं है। वर्चुअल मशीन यह निर्धारित नहीं कर सकती कि आप किस विधि का मतलब रखते हैं, क्योंकि इससे कोई फर्क नहीं पड़ता कि आप रिटर्न वैल्यू के साथ क्या करते हैं।

8.2 से उद्धरण। कक्षा के सदस्य

एक विधि के लिए, एक आदेश दिया गया 3-ट्यूपल जिसमें शामिल है:

  - तर्क प्रकार: विधि सदस्य को तर्क के प्रकारों की एक सूची।
- वापसी का प्रकार: विधि सदस्य का वापसी प्रकार।
- खंड फेंकता है: विधि सदस्य के फेंक खंड में घोषित अपवाद प्रकार।
 

जावा विनिर्देश के अपने उद्धरण के संयोजन में:

दो तरीकों का एक ही हस्ताक्षर होता है यदि उनके पास समान नाम और तर्क प्रकार हैं।

तथा

यह दो तरीकों की घोषणा करने के लिए एक संकलन-समय त्रुटि है   कक्षा में ओवरराइड समकक्ष हस्ताक्षर।

इसके लिए एक संकलन-समय त्रुटि की आवश्यकता होती है, इसलिए यह कंपाइलर की निगरानी है।

0
जोड़ा
अभी भी यह जेवीएम द्वारा चलाता है
जोड़ा लेखक shreyansh jogi, स्रोत
यहां तक ​​कि मैं विनिर्देश भी सहमत हूं। लेकिन कारण खोजना JVM विनिर्देश के अनुसार व्यवहार नहीं कर रहा है
जोड़ा लेखक shreyansh jogi, स्रोत